From 6fdc1cccd990f1fa432bee5acfa75b85f21d66b1 Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Wed, 21 Aug 2024 17:29:28 +0800 Subject: [PATCH 1/7] get TokenCredential from ConfigurableBootstrapContext --- ...AzureTokenCredentialAutoConfiguration.java | 4 +++ .../KeyVaultEnvironmentPostProcessor.java | 31 ++++++++++++------- ...KeyVaultEnvironmentPostProcessorTests.java | 8 ++--- ...ultSecretPropertySourceUserAgentTests.java | 3 +- ...tractAzureServiceClientBuilderFactory.java | 6 ++-- 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/context/AzureTokenCredentialAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/context/AzureTokenCredentialAutoConfiguration.java index 6a1950c7d41c..c6a9ee8e2760 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/context/AzureTokenCredentialAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/context/AzureTokenCredentialAutoConfiguration.java @@ -22,6 +22,8 @@ import com.azure.spring.cloud.core.implementation.factory.credential.ManagedIdentityCredentialBuilderFactory; import com.azure.spring.cloud.core.implementation.factory.credential.UsernamePasswordCredentialBuilderFactory; import com.azure.spring.cloud.core.provider.authentication.TokenCredentialOptionsProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; @@ -51,6 +53,7 @@ @Configuration(proxyBeanMethods = false) @AutoConfigureAfter(TaskExecutionAutoConfiguration.class) public class AzureTokenCredentialAutoConfiguration extends AzureServiceConfigurationBase { + private static final Logger LOGGER = LoggerFactory.getLogger(AzureTokenCredentialAutoConfiguration.class); private final IdentityClientProperties identityClientProperties; @@ -68,6 +71,7 @@ TokenCredential tokenCredential(DefaultAzureCredentialBuilderFactory factory, if (globalTokenCredential != null) { return globalTokenCredential; } else { + LOGGER.debug("No global token credential found, constructing default credential."); return factory.build().build(); } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessor.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessor.java index 9b8a54b8fdcb..ad73b561e03d 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessor.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessor.java @@ -3,20 +3,23 @@ package com.azure.spring.cloud.autoconfigure.implementation.keyvault.environment; +import com.azure.core.credential.TokenCredential; import com.azure.security.keyvault.secrets.SecretClient; import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.implementation.keyvault.secrets.properties.AzureKeyVaultPropertySourceProperties; import com.azure.spring.cloud.autoconfigure.implementation.keyvault.secrets.properties.AzureKeyVaultSecretProperties; +import com.azure.spring.cloud.core.implementation.credential.resolver.AzureTokenCredentialResolver; import com.azure.spring.cloud.core.implementation.util.AzurePropertiesUtils; import com.azure.spring.cloud.core.implementation.util.AzureSpringIdentifier; import com.azure.spring.cloud.service.implementation.keyvault.secrets.SecretClientBuilderFactory; import org.apache.commons.logging.Log; +import org.springframework.boot.ConfigurableBootstrapContext; import org.springframework.boot.SpringApplication; import org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor; import org.springframework.boot.context.properties.bind.Bindable; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.boot.env.EnvironmentPostProcessor; -import org.springframework.boot.logging.DeferredLog; +import org.springframework.boot.logging.DeferredLogFactory; import org.springframework.core.Ordered; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MutablePropertySources; @@ -44,21 +47,17 @@ public class KeyVaultEnvironmentPostProcessor implements EnvironmentPostProcesso private static final String SKIP_CONFIGURE_REASON_FORMAT = "Skip configuring Key Vault PropertySource because %s."; private final Log logger; + private final ConfigurableBootstrapContext bootstrapContext; /** * Creates a new instance of {@link KeyVaultEnvironmentPostProcessor}. - * @param logger The logger used in this class. + * @param loggerFactory The logger factory to get the logger. + * @param bootstrapContext The bootstrap context. */ - public KeyVaultEnvironmentPostProcessor(Log logger) { - this.logger = logger; - } - - /** - * Construct a {@link KeyVaultEnvironmentPostProcessor} instance with a new {@link DeferredLog}. - */ - public KeyVaultEnvironmentPostProcessor() { - this.logger = new DeferredLog(); + public KeyVaultEnvironmentPostProcessor(DeferredLogFactory loggerFactory, ConfigurableBootstrapContext bootstrapContext) { + this.logger = loggerFactory.getLog(getClass()); + this.bootstrapContext = bootstrapContext; } /** @@ -155,6 +154,16 @@ private AzureKeyVaultSecretProperties toAzureKeyVaultSecretProperties( SecretClient buildSecretClient(AzureKeyVaultSecretProperties secretProperties) { SecretClientBuilderFactory factory = new SecretClientBuilderFactory(secretProperties); factory.setSpringIdentifier(AzureSpringIdentifier.AZURE_SPRING_KEY_VAULT_SECRETS); + + if (bootstrapContext != null && bootstrapContext.isRegistered(TokenCredential.class)) { + // If TokenCredential is registered in bootstrap context, use it to build SecretClient. + // This will ignore the credential properties configured + logger.debug("TokenCredential is registered in bootstrap context, use it to build SecretClient."); + factory.setTokenCredentialResolver( + new AzureTokenCredentialResolver(ignored -> bootstrapContext.get(TokenCredential.class)) + ); + } + return factory.build().buildClient(); } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java index 923d3aa3c5a5..acb37ed76235 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import org.springframework.boot.SpringApplication; -import org.springframework.boot.logging.DeferredLog; +import org.springframework.boot.logging.DeferredLogs; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertySource; import org.springframework.core.env.SystemEnvironmentPropertySource; @@ -46,7 +46,7 @@ class KeyVaultEnvironmentPostProcessorTests { @BeforeEach void beforeEach() { - processor = spy(new KeyVaultEnvironmentPostProcessor(new DeferredLog())); + processor = spy(new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), null)); environment = new MockEnvironment(); propertySources = environment.getPropertySources(); SecretClient secretClient = mock(SecretClient.class); @@ -55,7 +55,7 @@ void beforeEach() { @Test void postProcessorHasConfiguredOrder() { - final KeyVaultEnvironmentPostProcessor processor = new KeyVaultEnvironmentPostProcessor(); + final KeyVaultEnvironmentPostProcessor processor = new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), null); assertEquals(processor.getOrder(), KeyVaultEnvironmentPostProcessor.ORDER); } @@ -308,7 +308,7 @@ void buildKeyVaultPropertySourceWithExceptionTest() { environment.setProperty("spring.cloud.azure.keyvault.secret.property-sources[0].name", NAME_0); environment.setProperty("spring.cloud.azure.keyvault.secret.property-sources[0].endpoint", ENDPOINT_0); assertThrows(IllegalStateException.class, - () -> new KeyVaultEnvironmentPostProcessor().postProcessEnvironment(environment, application)); + () -> new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), null).postProcessEnvironment(environment, application)); } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultSecretPropertySourceUserAgentTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultSecretPropertySourceUserAgentTests.java index decfc4a29478..94006e7ceae9 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultSecretPropertySourceUserAgentTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultSecretPropertySourceUserAgentTests.java @@ -11,6 +11,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.parallel.Isolated; +import org.springframework.boot.logging.DeferredLogs; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; @@ -32,7 +33,7 @@ public void userAgentTest(CapturedOutput output) { properties.getRetry().getFixed().setDelay(Duration.ofSeconds(1)); properties.getRetry().getFixed().setMaxRetries(0); - KeyVaultEnvironmentPostProcessor environmentPostProcessor = new KeyVaultEnvironmentPostProcessor(); + KeyVaultEnvironmentPostProcessor environmentPostProcessor = new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), null); SecretClient secretClient = environmentPostProcessor.buildSecretClient(properties); try { secretClient.getSecret("property-source-name1"); diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/cloud/core/implementation/factory/AbstractAzureServiceClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/cloud/core/implementation/factory/AbstractAzureServiceClientBuilderFactory.java index 27423835fcc2..a2e8c565d8f2 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/cloud/core/implementation/factory/AbstractAzureServiceClientBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/cloud/core/implementation/factory/AbstractAzureServiceClientBuilderFactory.java @@ -200,6 +200,8 @@ protected void configureCredential(T builder) { () -> new IllegalArgumentException("Consumer should not be null")); + LOGGER.debug("Will configure the credential of type {} for {}.", azureCredential.getClass().getSimpleName(), + builder.getClass().getSimpleName()); consumer.accept(azureCredential); credentialConfigured = true; } @@ -244,8 +246,8 @@ protected void configureConnectionString(T builder) { */ protected void configureDefaultCredential(T builder) { if (!credentialConfigured) { - LOGGER.info("Will configure the default credential of type {} for {}.", - this.defaultTokenCredential.getClass().getSimpleName(), builder.getClass()); + LOGGER.debug("Will configure the default credential of type {} for {}.", + this.defaultTokenCredential.getClass().getSimpleName(), builder.getClass().getSimpleName()); consumeDefaultTokenCredential().accept(builder, this.defaultTokenCredential); } } From 07e5e0654b820b2131e206469568acd11ad796b1 Mon Sep 17 00:00:00 2001 From: Muyao Date: Thu, 22 Aug 2024 15:57:04 +0800 Subject: [PATCH 2/7] add ut --- ...KeyVaultEnvironmentPostProcessorTests.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java index acb37ed76235..9e8bd2850a90 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java @@ -3,6 +3,7 @@ package com.azure.spring.cloud.autoconfigure.implementation.keyvault.environment; +import com.azure.core.credential.TokenCredential; import com.azure.security.keyvault.secrets.SecretClient; import com.azure.spring.cloud.autoconfigure.implementation.keyvault.secrets.properties.AzureKeyVaultPropertySourceProperties; import com.azure.spring.cloud.autoconfigure.implementation.keyvault.secrets.properties.AzureKeyVaultSecretProperties; @@ -10,6 +11,7 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; +import org.springframework.boot.ConfigurableBootstrapContext; import org.springframework.boot.SpringApplication; import org.springframework.boot.logging.DeferredLogs; import org.springframework.core.env.MutablePropertySources; @@ -29,7 +31,11 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.springframework.core.env.StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME; class KeyVaultEnvironmentPostProcessorTests { @@ -43,9 +49,13 @@ class KeyVaultEnvironmentPostProcessorTests { private KeyVaultEnvironmentPostProcessor processor; private MockEnvironment environment; private MutablePropertySources propertySources; + private ConfigurableBootstrapContext context; @BeforeEach void beforeEach() { + context = mock(ConfigurableBootstrapContext.class); + TokenCredential tokenCredential = mock(TokenCredential.class); + when(context.get(TokenCredential.class)).thenReturn(tokenCredential); processor = spy(new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), null)); environment = new MockEnvironment(); propertySources = environment.getPropertySources(); @@ -53,6 +63,26 @@ void beforeEach() { doReturn(secretClient).when(processor).buildSecretClient(any(AzureKeyVaultSecretProperties.class)); } + @Test + void testContextRegister_withTokenCredentialRegistered() { + when(context.isRegistered(TokenCredential.class)).thenReturn(true); + processor = spy(new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), context)); + + assertThrows(IllegalStateException.class, () -> processor.buildSecretClient(new AzureKeyVaultSecretProperties())); + + verify(context, times(1)).get(TokenCredential.class); + } + + @Test + void testContextRegister_withoutTokenCredentialRegistered() { + when(context.isRegistered(TokenCredential.class)).thenReturn(false); + processor = spy(new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), context)); + + assertThrows(IllegalStateException.class, () -> processor.buildSecretClient(new AzureKeyVaultSecretProperties())); + + verify(context, never()).get(TokenCredential.class); + } + @Test void postProcessorHasConfiguredOrder() { final KeyVaultEnvironmentPostProcessor processor = new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), null); From d692a4ef7388b64151ed2232b0d145eaba6bc2d4 Mon Sep 17 00:00:00 2001 From: Muyao Date: Thu, 22 Aug 2024 16:12:39 +0800 Subject: [PATCH 3/7] fix --- .../environment/KeyVaultEnvironmentPostProcessorTests.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java index 9e8bd2850a90..7ffba6b41bfb 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java @@ -64,7 +64,7 @@ void beforeEach() { } @Test - void testContextRegister_withTokenCredentialRegistered() { + void testContextRegisterWithTokenCredentialRegistered() { when(context.isRegistered(TokenCredential.class)).thenReturn(true); processor = spy(new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), context)); @@ -74,7 +74,7 @@ void testContextRegister_withTokenCredentialRegistered() { } @Test - void testContextRegister_withoutTokenCredentialRegistered() { + void testContextRegisterWithoutTokenCredentialRegistered() { when(context.isRegistered(TokenCredential.class)).thenReturn(false); processor = spy(new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), context)); From 8dc0a2dbabdf6607b7776f5dc3d3fbd949cc7fb3 Mon Sep 17 00:00:00 2001 From: Muyao Date: Thu, 22 Aug 2024 16:32:20 +0800 Subject: [PATCH 4/7] add changelog --- sdk/spring/CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sdk/spring/CHANGELOG.md b/sdk/spring/CHANGELOG.md index 5edc0f0cedbe..ecfd7c8bd056 100644 --- a/sdk/spring/CHANGELOG.md +++ b/sdk/spring/CHANGELOG.md @@ -1,4 +1,11 @@ # Release History +## 5.16.0-beta.1 (unreleased) + +### Spring Cloud Azure Autoconfigure +This section includes changes in `spring-cloud-azure-autoconfigure` module. + +#### Features Added +- Support to use registered `TokenCredential` to build SecretClient in KeyVaultEnvironmentPostProcessor [#41580](https://github.com/Azure/azure-sdk-for-java/pull/41580). ## 5.15.0 (2024-08-07) - This release is compatible with Spring Boot 3.0.0-3.0.13, 3.1.0-3.1.12, 3.2.0-3.2.7, 3.3.0-3.3.2. (Note: 3.0.x (x>13), 3.1.y (y>12), 3.2.z (z>7) and 3.3.m (m>2) should be supported, but they aren't tested with this release.) From 06b0963f4a6267014bae0023201cfc2945fdf813 Mon Sep 17 00:00:00 2001 From: Muyao Feng <92105726+Netyyyy@users.noreply.github.com> Date: Thu, 22 Aug 2024 16:37:56 +0800 Subject: [PATCH 5/7] Update CHANGELOG.md --- sdk/spring/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/spring/CHANGELOG.md b/sdk/spring/CHANGELOG.md index ecfd7c8bd056..fe17516e633e 100644 --- a/sdk/spring/CHANGELOG.md +++ b/sdk/spring/CHANGELOG.md @@ -5,7 +5,7 @@ This section includes changes in `spring-cloud-azure-autoconfigure` module. #### Features Added -- Support to use registered `TokenCredential` to build SecretClient in KeyVaultEnvironmentPostProcessor [#41580](https://github.com/Azure/azure-sdk-for-java/pull/41580). +- Provide extension point to configure token credential for Key Vault property source [#41580](https://github.com/Azure/azure-sdk-for-java/pull/41580). ## 5.15.0 (2024-08-07) - This release is compatible with Spring Boot 3.0.0-3.0.13, 3.1.0-3.1.12, 3.2.0-3.2.7, 3.3.0-3.3.2. (Note: 3.0.x (x>13), 3.1.y (y>12), 3.2.z (z>7) and 3.3.m (m>2) should be supported, but they aren't tested with this release.) From 2347d45ca70f2f9fc2fdc7d1dd503b5978261874 Mon Sep 17 00:00:00 2001 From: Muyao Date: Thu, 22 Aug 2024 17:42:40 +0800 Subject: [PATCH 6/7] update ut --- .../KeyVaultEnvironmentPostProcessorTests.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java index 7ffba6b41bfb..2db4a7a93438 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessorTests.java @@ -53,9 +53,6 @@ class KeyVaultEnvironmentPostProcessorTests { @BeforeEach void beforeEach() { - context = mock(ConfigurableBootstrapContext.class); - TokenCredential tokenCredential = mock(TokenCredential.class); - when(context.get(TokenCredential.class)).thenReturn(tokenCredential); processor = spy(new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), null)); environment = new MockEnvironment(); propertySources = environment.getPropertySources(); @@ -65,20 +62,30 @@ void beforeEach() { @Test void testContextRegisterWithTokenCredentialRegistered() { + context = mock(ConfigurableBootstrapContext.class); + TokenCredential tokenCredential = mock(TokenCredential.class); + when(context.get(TokenCredential.class)).thenReturn(tokenCredential); when(context.isRegistered(TokenCredential.class)).thenReturn(true); processor = spy(new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), context)); + AzureKeyVaultSecretProperties secretProperties = new AzureKeyVaultSecretProperties(); + secretProperties.setEndpoint(ENDPOINT_0); - assertThrows(IllegalStateException.class, () -> processor.buildSecretClient(new AzureKeyVaultSecretProperties())); + processor.buildSecretClient(secretProperties); verify(context, times(1)).get(TokenCredential.class); } @Test void testContextRegisterWithoutTokenCredentialRegistered() { + context = mock(ConfigurableBootstrapContext.class); + TokenCredential tokenCredential = mock(TokenCredential.class); + when(context.get(TokenCredential.class)).thenReturn(tokenCredential); when(context.isRegistered(TokenCredential.class)).thenReturn(false); processor = spy(new KeyVaultEnvironmentPostProcessor(new DeferredLogs(), context)); + AzureKeyVaultSecretProperties secretProperties = new AzureKeyVaultSecretProperties(); + secretProperties.setEndpoint(ENDPOINT_0); - assertThrows(IllegalStateException.class, () -> processor.buildSecretClient(new AzureKeyVaultSecretProperties())); + processor.buildSecretClient(secretProperties); verify(context, never()).get(TokenCredential.class); } From 23e1ccf74e71752a7318e9eca30a09b2addfaa1e Mon Sep 17 00:00:00 2001 From: Muyao Date: Fri, 23 Aug 2024 14:58:47 +0800 Subject: [PATCH 7/7] update log --- .../environment/KeyVaultEnvironmentPostProcessor.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessor.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessor.java index ad73b561e03d..8d2c3744a5ff 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessor.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/keyvault/environment/KeyVaultEnvironmentPostProcessor.java @@ -158,9 +158,10 @@ SecretClient buildSecretClient(AzureKeyVaultSecretProperties secretProperties) { if (bootstrapContext != null && bootstrapContext.isRegistered(TokenCredential.class)) { // If TokenCredential is registered in bootstrap context, use it to build SecretClient. // This will ignore the credential properties configured - logger.debug("TokenCredential is registered in bootstrap context, use it to build SecretClient."); + TokenCredential registerCredential = bootstrapContext.get(TokenCredential.class); + logger.debug(registerCredential.getClass().getSimpleName() + " is registered in bootstrap context, use it to build SecretClient."); factory.setTokenCredentialResolver( - new AzureTokenCredentialResolver(ignored -> bootstrapContext.get(TokenCredential.class)) + new AzureTokenCredentialResolver(ignored -> registerCredential) ); }