From 09b0d1e3ded0a9688e54c46f837846e4eeb671a0 Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Tue, 9 Nov 2021 00:09:16 +0800 Subject: [PATCH 01/15] refactor the global configuration properties to support configure http/amqp properties globally --- .../resources/spotbugs/spotbugs-exclude.xml | 2 +- .../cosmos/CosmosHealthConfiguration.java | 2 +- .../AzureServiceConfigurationBase.java | 26 +++ ...zureAppConfigurationAutoConfiguration.java | 1 + .../AzureAppConfigurationProperties.java | 2 +- ...ConfigurationEnvironmentPostProcessor.java | 42 +++- .../cosmos/AzureCosmosAutoConfiguration.java | 1 + .../AzureCosmosProperties.java | 14 +- .../cosmos/CosmosDataAutoConfiguration.java | 2 +- .../properties/AzureEventHubProperties.java | 2 +- ...bstractServiceBusJmsAutoConfiguration.java | 1 + ...PremiumServiceBusJmsAutoConfiguration.java | 1 + ...PremiumServiceBusJmsAutoConfiguration.java | 1 + .../AzureServiceBusJmsProperties.java | 2 +- ...eKeyVaultCertificateAutoConfiguration.java | 1 + .../AzureKeyVaultCertificateProperties.java | 4 +- .../{ => common}/AzureKeyVaultProperties.java | 3 +- .../env/KeyVaultEnvironmentPostProcessor.java | 2 +- .../AzureKeyVaultSecretAutoConfiguration.java | 1 + .../AzureKeyVaultSecretProperties.java | 5 +- .../properties/AzureGlobalProperties.java | 181 +++++++++++++++- .../properties/core/client/ClientCP.java | 8 - .../properties/core/client/HttpClientCP.java | 9 + .../properties/core/retry/RetryCP.java | 2 + ...QueueResourceManagerAutoConfiguration.java | 2 +- .../AzureStorageBlobAutoConfiguration.java | 1 + .../AzureStorageBlobProperties.java | 2 +- ...zureStorageFileShareAutoConfiguration.java | 1 + .../AzureStorageFileShareProperties.java | 2 +- .../AzureStorageQueueAutoConfiguration.java | 1 + .../AzureStorageQueueProperties.java | 2 +- .../cosmos/CosmosSampleApplication.java | 2 +- .../AzureServiceConfigurationBaseTest.java | 198 ++++++++++++++++++ ...AppConfigurationAutoConfigurationTest.java | 1 + ...igurationEnvironmentPostProcessorTest.java | 114 +++++++++- .../AzureCosmosAutoConfigurationTest.java | 2 + .../cosmos/AzureCosmosPropertiesTest.java | 1 + ...actServiceBusJmsAutoConfigurationTest.java | 1 + ...iumServiceBusJmsAutoConfigurationTest.java | 1 + ...iumServiceBusJmsAutoConfigurationTest.java | 1 + ...reKeyVaultSecretAutoConfigurationTest.java | 1 + ...AzureStorageBlobAutoConfigurationTest.java | 1 + ...StorageFileShareAutoConfigurationTest.java | 1 + ...zureStorageQueueAutoConfigurationTest.java | 1 + .../azure/spring/core/aware/ClientAware.java | 9 +- .../AzureHttpLogOptionsConverter.java | 6 +- ...AbstractAzureHttpClientBuilderFactory.java | 11 +- .../core/properties/AzurePropertiesUtils.java | 21 ++ .../properties/client/ClientProperties.java | 6 - .../client/HttpClientProperties.java | 6 + .../properties/client/LoggingProperties.java | 2 +- 51 files changed, 637 insertions(+), 75 deletions(-) rename sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/appconfiguration/{ => properties}/AzureAppConfigurationProperties.java (94%) rename sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cosmos/{ => properties}/AzureCosmosProperties.java (93%) rename sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/{ => properties}/AzureServiceBusJmsProperties.java (98%) rename sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/certificates/{ => properties}/AzureKeyVaultCertificateProperties.java (89%) rename sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/{ => common}/AzureKeyVaultProperties.java (82%) rename sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/{ => properties}/AzureKeyVaultSecretProperties.java (83%) rename sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/{ => properties}/AzureStorageBlobProperties.java (96%) rename sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/{ => properties}/AzureStorageFileShareProperties.java (95%) rename sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/queue/{ => properties}/AzureStorageQueueProperties.java (95%) create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBaseTest.java diff --git a/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml b/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml index a1c840e69449..e4a1d26b3cc6 100755 --- a/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml +++ b/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml @@ -2297,7 +2297,7 @@ - + diff --git a/sdk/spring/spring-cloud-azure-actuator-autoconfigure/src/main/java/com/azure/spring/cloud/actuate/autoconfigure/cosmos/CosmosHealthConfiguration.java b/sdk/spring/spring-cloud-azure-actuator-autoconfigure/src/main/java/com/azure/spring/cloud/actuate/autoconfigure/cosmos/CosmosHealthConfiguration.java index 9ac0d5d66581..fb796eeadcee 100644 --- a/sdk/spring/spring-cloud-azure-actuator-autoconfigure/src/main/java/com/azure/spring/cloud/actuate/autoconfigure/cosmos/CosmosHealthConfiguration.java +++ b/sdk/spring/spring-cloud-azure-actuator-autoconfigure/src/main/java/com/azure/spring/cloud/actuate/autoconfigure/cosmos/CosmosHealthConfiguration.java @@ -6,7 +6,7 @@ import com.azure.cosmos.CosmosAsyncClient; import com.azure.spring.cloud.actuate.cosmos.CosmosHealthIndicator; import com.azure.spring.cloud.autoconfigure.cosmos.AzureCosmosAutoConfiguration; -import com.azure.spring.cloud.autoconfigure.cosmos.AzureCosmosProperties; +import com.azure.spring.cloud.autoconfigure.cosmos.properties.AzureCosmosProperties; import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.autoconfigure.AutoConfigureAfter; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBase.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBase.java index 6c5ad74eeb03..57420ccfe922 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBase.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBase.java @@ -4,8 +4,12 @@ package com.azure.spring.cloud.autoconfigure; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; +import com.azure.spring.core.aware.ClientAware; +import com.azure.spring.core.aware.ProxyAware; +import com.azure.spring.core.aware.RetryAware; import com.azure.spring.core.properties.AzureProperties; import com.azure.spring.core.properties.AzurePropertiesUtils; +import org.springframework.beans.BeanUtils; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; @@ -24,6 +28,28 @@ public AzureServiceConfigurationBase(AzureGlobalProperties azureProperties) { protected T loadProperties(AzureGlobalProperties source, T target) { AzurePropertiesUtils.copyAzureCommonProperties(source, target); + + if (target.getClient() instanceof ClientAware.HttpClient) { + BeanUtils.copyProperties(source.getClient().getHttp(), target.getClient()); + + ClientAware.HttpClient targetClient = (ClientAware.HttpClient) target.getClient(); + BeanUtils.copyProperties(source.getClient().getHttp().getLogging(), targetClient.getLogging()); + targetClient.getLogging().getAllowedHeaderNames().addAll(source.getClient().getHttp().getLogging().getAllowedHeaderNames()); + targetClient.getLogging().getAllowedQueryParamNames().addAll(source.getClient().getHttp().getLogging().getAllowedQueryParamNames()); + } + + if (target.getClient() instanceof ClientAware.AmqpClient) { + BeanUtils.copyProperties(source.getClient().getAmqp(), target.getClient()); + } + + if (target.getProxy() instanceof ProxyAware.HttpProxy) { + BeanUtils.copyProperties(source.getProxy().getHttp(), target.getProxy()); + } + + if (target.getRetry() instanceof RetryAware.HttpRetry) { + BeanUtils.copyProperties(source.getRetry().getHttp(), target.getRetry()); + } + return target; } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/appconfiguration/AzureAppConfigurationAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/appconfiguration/AzureAppConfigurationAutoConfiguration.java index a2ad21dd3aca..326eef1ab4de 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/appconfiguration/AzureAppConfigurationAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/appconfiguration/AzureAppConfigurationAutoConfiguration.java @@ -7,6 +7,7 @@ import com.azure.data.appconfiguration.ConfigurationClient; import com.azure.data.appconfiguration.ConfigurationClientBuilder; import com.azure.spring.cloud.autoconfigure.AzureServiceConfigurationBase; +import com.azure.spring.cloud.autoconfigure.appconfiguration.properties.AzureAppConfigurationProperties; import com.azure.spring.cloud.autoconfigure.condition.ConditionalOnAnyProperty; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import com.azure.spring.service.appconfiguration.ConfigurationClientBuilderFactory; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/appconfiguration/AzureAppConfigurationProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/appconfiguration/properties/AzureAppConfigurationProperties.java similarity index 94% rename from sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/appconfiguration/AzureAppConfigurationProperties.java rename to sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/appconfiguration/properties/AzureAppConfigurationProperties.java index 43a488bb5a44..3e004709101a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/appconfiguration/AzureAppConfigurationProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/appconfiguration/properties/AzureAppConfigurationProperties.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.autoconfigure.appconfiguration; +package com.azure.spring.cloud.autoconfigure.appconfiguration.properties; import com.azure.data.appconfiguration.ConfigurationServiceVersion; import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureHttpCP; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java index 606323545ba2..a704fe09238a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java @@ -11,6 +11,7 @@ import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; +import java.time.Duration; import java.util.HashMap; import java.util.Map; import java.util.function.Function; @@ -22,10 +23,15 @@ import static com.azure.core.util.Configuration.PROPERTY_AZURE_CLOUD; import static com.azure.core.util.Configuration.PROPERTY_AZURE_HTTP_LOG_DETAIL_LEVEL; import static com.azure.core.util.Configuration.PROPERTY_AZURE_PASSWORD; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_CONNECT_TIMEOUT; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_READ_TIMEOUT; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_RESPONSE_TIMEOUT; import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_RETRY_COUNT; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_WRITE_TIMEOUT; import static com.azure.core.util.Configuration.PROPERTY_AZURE_SUBSCRIPTION_ID; import static com.azure.core.util.Configuration.PROPERTY_AZURE_TENANT_ID; import static com.azure.core.util.Configuration.PROPERTY_AZURE_USERNAME; +import static com.azure.core.util.Configuration.PROPERTY_NO_PROXY; /** * An EnvironmentPostProcessor to convert environment variables predefined by Azure Core and Azure SDKs to Azure Spring @@ -63,16 +69,21 @@ enum AzureCoreEnvMapping { // TODO (xiada): PROPERTY_AZURE_LOG_LEVEL, how to set this to env? - httpLogLevel(PROPERTY_AZURE_HTTP_LOG_DETAIL_LEVEL, "client.logging.level"), + maxRetry(PROPERTY_AZURE_REQUEST_RETRY_COUNT, "retry.max-attempts"), - maxRetry(PROPERTY_AZURE_REQUEST_RETRY_COUNT, "retry.max-attempts"); + httpLogLevel(PROPERTY_AZURE_HTTP_LOG_DETAIL_LEVEL, "client.http.logging.level"), + + httpConnectTimeout(PROPERTY_AZURE_REQUEST_CONNECT_TIMEOUT, "client.http.connect-timeout", convertMillisToDuration()), + + httpReadTimeout(PROPERTY_AZURE_REQUEST_READ_TIMEOUT, "client.http.read-timeout", convertMillisToDuration()), + + httpWriteTimeout(PROPERTY_AZURE_REQUEST_WRITE_TIMEOUT, "client.http.write-timeout", convertMillisToDuration()), + + httpResponseTimeout(PROPERTY_AZURE_REQUEST_RESPONSE_TIMEOUT, "client.http.response-timeout", convertMillisToDuration()), + + httpNoProxy(PROPERTY_NO_PROXY, "proxy.http.non-proxy-hosts") + ; - // TODO (xiada): we can't configure http at global level: - // PROPERTY_AZURE_REQUEST_CONNECT_TIMEOUT, - // PROPERTY_AZURE_REQUEST_WRITE_TIMEOUT, - // PROPERTY_AZURE_REQUEST_RESPONSE_TIMEOUT, - // PROPERTY_AZURE_REQUEST_READ_TIMEOUT, - // PROPERTY_NO_PROXY // TODO (xiada): how to set this proxy? // proxy(PROPERTY_HTTP_PROXY, PROPERTY_HTTPS_PROXY) @@ -93,9 +104,22 @@ enum AzureCoreEnvMapping { } } + private static Function convertMillisToDuration() { + return ms -> { + try { + return Duration.ofMillis(Integer.parseInt(ms)).toString(); + } catch (Exception ignore) { + LOGGER.debug("The millisecond value {} is malformed.", ms); + return null; + } + }; + } + enum AzureSdkEnvMapping { keyVaultSecretEndpoint("AZURE_KEYVAULT_ENDPOINT", "keyvault.secret.endpoint"), - keyVaultCertificateEndpoint("AZURE_KEYVAULT_ENDPOINT", "keyvault.certificate.endpoint"); + keyVaultCertificateEndpoint("AZURE_KEYVAULT_ENDPOINT", "keyvault.certificate.endpoint"), + eventHubsConnectionString("AZURE_EVENT_HUBS_CONNECTION_STRING", "eventhubs.connection-string") + ; private final String sdkEnvName; private final String springPropertyName; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosAutoConfiguration.java index 8ab18f416449..60fe87fc48d0 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosAutoConfiguration.java @@ -8,6 +8,7 @@ import com.azure.cosmos.CosmosClientBuilder; import com.azure.spring.cloud.autoconfigure.AzureServiceConfigurationBase; import com.azure.spring.cloud.autoconfigure.condition.ConditionalOnAnyProperty; +import com.azure.spring.cloud.autoconfigure.cosmos.properties.AzureCosmosProperties; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import com.azure.spring.service.cosmos.CosmosClientBuilderFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cosmos/properties/AzureCosmosProperties.java similarity index 93% rename from sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosProperties.java rename to sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cosmos/properties/AzureCosmosProperties.java index a0ba63b51990..f3219f6a69cc 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cosmos/properties/AzureCosmosProperties.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.autoconfigure.cosmos; +package com.azure.spring.cloud.autoconfigure.cosmos.properties; import com.azure.cosmos.ConnectionMode; import com.azure.cosmos.ConsistencyLevel; @@ -10,8 +10,8 @@ import com.azure.cosmos.ThrottlingRetryOptions; import com.azure.cosmos.models.CosmosPermissionProperties; import com.azure.spring.cloud.autoconfigure.properties.core.AbstractAzureServiceCP; -import com.azure.spring.core.properties.client.ClientProperties; -import com.azure.spring.core.properties.proxy.HttpProxyProperties; +import com.azure.spring.cloud.autoconfigure.properties.core.client.ClientCP; +import com.azure.spring.cloud.autoconfigure.properties.core.proxy.HttpProxyCP; import com.azure.spring.service.cosmos.CosmosProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.validation.annotation.Validated; @@ -30,10 +30,10 @@ public class AzureCosmosProperties extends AbstractAzureServiceCP implements Cos public static final String PREFIX = "spring.cloud.azure.cosmos"; @NestedConfigurationProperty - private final HttpProxyProperties proxy = new HttpProxyProperties(); + private final HttpProxyCP proxy = new HttpProxyCP(); @NestedConfigurationProperty - private final ClientProperties client = new ClientProperties(); + private final ClientCP client = new ClientCP(); @NotEmpty @Pattern(regexp = "http[s]{0,1}://.*.documents.azure.com.*") @@ -73,12 +73,12 @@ public class AzureCosmosProperties extends AbstractAzureServiceCP implements Cos private boolean populateQueryMetrics; @Override - public HttpProxyProperties getProxy() { + public HttpProxyCP getProxy() { return proxy; } @Override - public ClientProperties getClient() { + public ClientCP getClient() { return client; } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/data/cosmos/CosmosDataAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/data/cosmos/CosmosDataAutoConfiguration.java index c90b2b2e60c5..4545d07d49a8 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/data/cosmos/CosmosDataAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/data/cosmos/CosmosDataAutoConfiguration.java @@ -3,7 +3,7 @@ package com.azure.spring.cloud.autoconfigure.data.cosmos; -import com.azure.spring.cloud.autoconfigure.cosmos.AzureCosmosProperties; +import com.azure.spring.cloud.autoconfigure.cosmos.properties.AzureCosmosProperties; import com.azure.spring.data.cosmos.config.AbstractCosmosConfiguration; import com.azure.spring.data.cosmos.config.CosmosConfig; import com.azure.spring.data.cosmos.core.CosmosTemplate; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/properties/AzureEventHubProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/properties/AzureEventHubProperties.java index ba034ca6fe0c..dc5abfa940d1 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/properties/AzureEventHubProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/properties/AzureEventHubProperties.java @@ -3,7 +3,7 @@ package com.azure.spring.cloud.autoconfigure.eventhubs.properties; -import com.azure.spring.cloud.autoconfigure.storage.blob.AzureStorageBlobProperties; +import com.azure.spring.cloud.autoconfigure.storage.blob.properties.AzureStorageBlobProperties; import com.azure.spring.core.properties.AzurePropertiesUtils; import com.azure.spring.service.eventhubs.properties.EventHubConsumerDescriptor; import com.azure.spring.service.eventhubs.properties.EventHubNamespaceDescriptor; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/AbstractServiceBusJmsAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/AbstractServiceBusJmsAutoConfiguration.java index 3b2698caa1ea..735ea603845e 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/AbstractServiceBusJmsAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/AbstractServiceBusJmsAutoConfiguration.java @@ -3,6 +3,7 @@ package com.azure.spring.cloud.autoconfigure.jms; +import com.azure.spring.cloud.autoconfigure.jms.properties.AzureServiceBusJmsProperties; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer; import org.springframework.context.annotation.Bean; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/NonPremiumServiceBusJmsAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/NonPremiumServiceBusJmsAutoConfiguration.java index 201f675962b7..d12f8cbd43f6 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/NonPremiumServiceBusJmsAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/NonPremiumServiceBusJmsAutoConfiguration.java @@ -3,6 +3,7 @@ package com.azure.spring.cloud.autoconfigure.jms; +import com.azure.spring.cloud.autoconfigure.jms.properties.AzureServiceBusJmsProperties; import com.azure.spring.core.connectionstring.implementation.ServiceBusConnectionString; import org.apache.qpid.jms.JmsConnectionFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/PremiumServiceBusJmsAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/PremiumServiceBusJmsAutoConfiguration.java index 0bf3990a2352..b77dd48a32ca 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/PremiumServiceBusJmsAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/PremiumServiceBusJmsAutoConfiguration.java @@ -3,6 +3,7 @@ package com.azure.spring.cloud.autoconfigure.jms; +import com.azure.spring.cloud.autoconfigure.jms.properties.AzureServiceBusJmsProperties; import com.microsoft.azure.servicebus.jms.ServiceBusJmsConnectionFactory; import com.microsoft.azure.servicebus.jms.ServiceBusJmsConnectionFactorySettings; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/AzureServiceBusJmsProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/properties/AzureServiceBusJmsProperties.java similarity index 98% rename from sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/AzureServiceBusJmsProperties.java rename to sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/properties/AzureServiceBusJmsProperties.java index 4a6706c44eae..16baa0601dfc 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/AzureServiceBusJmsProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/properties/AzureServiceBusJmsProperties.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.autoconfigure.jms; +package com.azure.spring.cloud.autoconfigure.jms.properties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.jms.support.QosSettings; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/certificates/AzureKeyVaultCertificateAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/certificates/AzureKeyVaultCertificateAutoConfiguration.java index a4bada364ef7..c75052f57f9e 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/certificates/AzureKeyVaultCertificateAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/certificates/AzureKeyVaultCertificateAutoConfiguration.java @@ -7,6 +7,7 @@ import com.azure.security.keyvault.certificates.CertificateClient; import com.azure.security.keyvault.certificates.CertificateClientBuilder; import com.azure.spring.cloud.autoconfigure.AzureServiceConfigurationBase; +import com.azure.spring.cloud.autoconfigure.keyvault.certificates.properties.AzureKeyVaultCertificateProperties; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import com.azure.spring.service.keyvault.certificates.CertificateClientBuilderFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/certificates/AzureKeyVaultCertificateProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/certificates/properties/AzureKeyVaultCertificateProperties.java similarity index 89% rename from sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/certificates/AzureKeyVaultCertificateProperties.java rename to sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/certificates/properties/AzureKeyVaultCertificateProperties.java index 531443693033..d6a3d71643ae 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/certificates/AzureKeyVaultCertificateProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/certificates/properties/AzureKeyVaultCertificateProperties.java @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.autoconfigure.keyvault.certificates; +package com.azure.spring.cloud.autoconfigure.keyvault.certificates.properties; import com.azure.security.keyvault.certificates.CertificateServiceVersion; -import com.azure.spring.cloud.autoconfigure.keyvault.AzureKeyVaultProperties; +import com.azure.spring.cloud.autoconfigure.keyvault.common.AzureKeyVaultProperties; import com.azure.spring.service.keyvault.certificates.KeyVaultCertificateProperties; /** diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/AzureKeyVaultProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/common/AzureKeyVaultProperties.java similarity index 82% rename from sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/AzureKeyVaultProperties.java rename to sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/common/AzureKeyVaultProperties.java index e2cbb27aa0d9..ed288f414732 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/AzureKeyVaultProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/common/AzureKeyVaultProperties.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.autoconfigure.keyvault; +package com.azure.spring.cloud.autoconfigure.keyvault.common; import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureHttpCP; @@ -10,7 +10,6 @@ */ public class AzureKeyVaultProperties extends AbstractAzureHttpCP { - // TODO (xiada): the default vault url private String endpoint; public String getEndpoint() { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/env/KeyVaultEnvironmentPostProcessor.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/env/KeyVaultEnvironmentPostProcessor.java index 338ed0409b77..4905594837f5 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/env/KeyVaultEnvironmentPostProcessor.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/env/KeyVaultEnvironmentPostProcessor.java @@ -5,7 +5,7 @@ import com.azure.security.keyvault.secrets.SecretClient; import com.azure.spring.cloud.autoconfigure.keyvault.secrets.AzureKeyVaultPropertySourceProperties; -import com.azure.spring.cloud.autoconfigure.keyvault.secrets.AzureKeyVaultSecretProperties; +import com.azure.spring.cloud.autoconfigure.keyvault.secrets.properties.AzureKeyVaultSecretProperties; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import com.azure.spring.core.properties.AzurePropertiesUtils; import com.azure.spring.service.keyvault.secrets.SecretClientBuilderFactory; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultSecretAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultSecretAutoConfiguration.java index d2a426ef8dcc..acc5c8ce0e44 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultSecretAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultSecretAutoConfiguration.java @@ -8,6 +8,7 @@ import com.azure.security.keyvault.secrets.SecretClientBuilder; import com.azure.spring.cloud.autoconfigure.AzureServiceConfigurationBase; import com.azure.spring.cloud.autoconfigure.condition.ConditionalOnAnyProperty; +import com.azure.spring.cloud.autoconfigure.keyvault.secrets.properties.AzureKeyVaultSecretProperties; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import com.azure.spring.service.keyvault.secrets.SecretClientBuilderFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultSecretProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/properties/AzureKeyVaultSecretProperties.java similarity index 83% rename from sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultSecretProperties.java rename to sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/properties/AzureKeyVaultSecretProperties.java index 2e8a87be56a6..492e6d9b147a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultSecretProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/properties/AzureKeyVaultSecretProperties.java @@ -1,10 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.autoconfigure.keyvault.secrets; +package com.azure.spring.cloud.autoconfigure.keyvault.secrets.properties; import com.azure.security.keyvault.secrets.SecretServiceVersion; -import com.azure.spring.cloud.autoconfigure.keyvault.AzureKeyVaultProperties; +import com.azure.spring.cloud.autoconfigure.keyvault.common.AzureKeyVaultProperties; +import com.azure.spring.cloud.autoconfigure.keyvault.secrets.AzureKeyVaultPropertySourceProperties; import com.azure.spring.service.keyvault.secrets.KeyVaultSecretProperties; import java.util.ArrayList; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java index 0f1532ce6e97..d1d45ed16244 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java @@ -3,15 +3,20 @@ package com.azure.spring.cloud.autoconfigure.properties; +import com.azure.core.amqp.AmqpTransportType; import com.azure.spring.cloud.autoconfigure.properties.core.authentication.TokenCredentialCP; import com.azure.spring.cloud.autoconfigure.properties.core.client.ClientCP; import com.azure.spring.cloud.autoconfigure.properties.core.profile.AzureProfileCP; import com.azure.spring.cloud.autoconfigure.properties.core.proxy.ProxyCP; import com.azure.spring.cloud.autoconfigure.properties.core.retry.RetryCP; import com.azure.spring.core.properties.AzureProperties; +import com.azure.spring.core.properties.client.LoggingProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; +import java.time.Duration; +import java.time.temporal.ChronoUnit; + import static com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties.PREFIX; /** @@ -23,13 +28,13 @@ public class AzureGlobalProperties implements AzureProperties { public static final String PREFIX = "spring.cloud.azure"; @NestedConfigurationProperty - protected final ClientCP client = new ClientCP(); + protected final GlobalClient client = new GlobalClient(); @NestedConfigurationProperty - protected final ProxyCP proxy = new ProxyCP(); + protected final GlobalProxyCP proxy = new GlobalProxyCP(); @NestedConfigurationProperty - protected final RetryCP retry = new RetryCP(); + protected final GlobalRetryCP retry = new GlobalRetryCP(); @NestedConfigurationProperty protected final TokenCredentialCP credential = new TokenCredentialCP(); @@ -38,17 +43,17 @@ public class AzureGlobalProperties implements AzureProperties { protected final AzureProfileCP profile = new AzureProfileCP(); @Override - public ClientCP getClient() { + public GlobalClient getClient() { return client; } @Override - public ProxyCP getProxy() { + public GlobalProxyCP getProxy() { return proxy; } @Override - public RetryCP getRetry() { + public GlobalRetryCP getRetry() { return retry; } @@ -61,4 +66,168 @@ public TokenCredentialCP getCredential() { public AzureProfileCP getProfile() { return profile; } + + /** + * Global configurations for the transport client underneath. + */ + public static final class GlobalClient extends ClientCP { + + private final HttpClientCP http = new HttpClientCP(); + private final AmqpClientCP amqp = new AmqpClientCP(); + + public HttpClientCP getHttp() { + return http; + } + + public AmqpClientCP getAmqp() { + return amqp; + } + } + + /** + * Global configurations for proxy. + */ + public static final class GlobalProxyCP extends ProxyCP { + + private final HttpProxyCP http = new HttpProxyCP(); + + public HttpProxyCP getHttp() { + return http; + } + } + + /** + * Global configurations for proxy. + */ + public static final class GlobalRetryCP extends RetryCP { + + private final HttpRetryCP http = new HttpRetryCP(); + + public HttpRetryCP getHttp() { + return http; + } + } + + /** + * Retry properties only apply to http-based clients. + */ + public static final class HttpRetryCP { + + private String retryAfterHeader; + private ChronoUnit retryAfterTimeUnit; + + public String getRetryAfterHeader() { + return retryAfterHeader; + } + + public void setRetryAfterHeader(String retryAfterHeader) { + this.retryAfterHeader = retryAfterHeader; + } + + public ChronoUnit getRetryAfterTimeUnit() { + return retryAfterTimeUnit; + } + + public void setRetryAfterTimeUnit(ChronoUnit retryAfterTimeUnit) { + this.retryAfterTimeUnit = retryAfterTimeUnit; + } + } + + /** + * Proxy properties only apply to http-based clients. + */ + public static final class HttpProxyCP { + + private String nonProxyHosts; + + public String getNonProxyHosts() { + return nonProxyHosts; + } + + public void setNonProxyHosts(String nonProxyHosts) { + this.nonProxyHosts = nonProxyHosts; + } + } + + /** + * Transport properties for http-based clients. + */ + public static final class HttpClientCP { + + private Duration writeTimeout; + private Duration responseTimeout; + private Duration readTimeout; + private Duration connectTimeout; + private Integer maximumConnectionPoolSize; + private Duration connectionIdleTimeout; + @NestedConfigurationProperty + private final LoggingProperties logging = new LoggingProperties(); + + public Duration getWriteTimeout() { + return writeTimeout; + } + + public void setWriteTimeout(Duration writeTimeout) { + this.writeTimeout = writeTimeout; + } + + public Duration getResponseTimeout() { + return responseTimeout; + } + + public void setResponseTimeout(Duration responseTimeout) { + this.responseTimeout = responseTimeout; + } + + public Duration getReadTimeout() { + return readTimeout; + } + + public void setReadTimeout(Duration readTimeout) { + this.readTimeout = readTimeout; + } + + public Duration getConnectTimeout() { + return connectTimeout; + } + + public void setConnectTimeout(Duration connectTimeout) { + this.connectTimeout = connectTimeout; + } + + public Integer getMaximumConnectionPoolSize() { + return maximumConnectionPoolSize; + } + + public void setMaximumConnectionPoolSize(Integer maximumConnectionPoolSize) { + this.maximumConnectionPoolSize = maximumConnectionPoolSize; + } + + public Duration getConnectionIdleTimeout() { + return connectionIdleTimeout; + } + + public void setConnectionIdleTimeout(Duration connectionIdleTimeout) { + this.connectionIdleTimeout = connectionIdleTimeout; + } + + public LoggingProperties getLogging() { + return logging; + } + } + + /** + * Transport properties for amqp-based clients. + */ + public static final class AmqpClientCP { + private AmqpTransportType transportType = AmqpTransportType.AMQP; + + public AmqpTransportType getTransportType() { + return transportType; + } + + public void setTransportType(AmqpTransportType transportType) { + this.transportType = transportType; + } + } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/ClientCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/ClientCP.java index 9988fd6669c3..013086b04033 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/ClientCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/ClientCP.java @@ -5,8 +5,6 @@ import com.azure.spring.core.aware.ClientAware; import com.azure.spring.core.properties.client.HeaderProperties; -import com.azure.spring.core.properties.client.LoggingProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; import java.util.ArrayList; import java.util.List; @@ -18,8 +16,6 @@ public class ClientCP implements ClientAware.Client { private String applicationId; private final List headers = new ArrayList<>(); - @NestedConfigurationProperty - private final LoggingProperties logging = new LoggingProperties(); @Override public String getApplicationId() { @@ -35,8 +31,4 @@ public List getHeaders() { return headers; } - @Override - public LoggingProperties getLogging() { - return logging; - } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpClientCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpClientCP.java index 79df4e42a04c..f3ee9a5024a8 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpClientCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpClientCP.java @@ -4,6 +4,8 @@ package com.azure.spring.cloud.autoconfigure.properties.core.client; import com.azure.spring.core.aware.ClientAware; +import com.azure.spring.core.properties.client.LoggingProperties; +import org.springframework.boot.context.properties.NestedConfigurationProperty; import java.time.Duration; @@ -18,6 +20,8 @@ public class HttpClientCP extends ClientCP implements ClientAware.HttpClient { private Duration connectTimeout; private Integer maximumConnectionPoolSize; private Duration connectionIdleTimeout; + @NestedConfigurationProperty + private final LoggingProperties logging = new LoggingProperties(); @Override public Duration getWriteTimeout() { @@ -69,4 +73,9 @@ public Duration getConnectionIdleTimeout() { public void setConnectionIdleTimeout(Duration connectionIdleTimeout) { this.connectionIdleTimeout = connectionIdleTimeout; } + + @Override + public LoggingProperties getLogging() { + return logging; + } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/RetryCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/RetryCP.java index 24e0b13fe6f3..ef3da87b652d 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/RetryCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/RetryCP.java @@ -5,6 +5,7 @@ import com.azure.spring.core.aware.RetryAware; import com.azure.spring.core.properties.retry.BackoffProperties; +import org.springframework.boot.context.properties.NestedConfigurationProperty; import java.time.Duration; @@ -13,6 +14,7 @@ */ public class RetryCP implements RetryAware.Retry { + @NestedConfigurationProperty private final Backoff backoff = new Backoff(); /** * The maximum number of attempts diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureStorageQueueResourceManagerAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureStorageQueueResourceManagerAutoConfiguration.java index 7b7f58d47f3c..bfcbe25ee234 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureStorageQueueResourceManagerAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureStorageQueueResourceManagerAutoConfiguration.java @@ -4,7 +4,7 @@ package com.azure.spring.cloud.autoconfigure.resourcemanager; import com.azure.resourcemanager.AzureResourceManager; -import com.azure.spring.cloud.autoconfigure.storage.queue.AzureStorageQueueProperties; +import com.azure.spring.cloud.autoconfigure.storage.queue.properties.AzureStorageQueueProperties; import com.azure.spring.cloud.resourcemanager.connectionstring.StorageQueueArmConnectionStringProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/AzureStorageBlobAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/AzureStorageBlobAutoConfiguration.java index b067d61042dd..7e665cf88687 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/AzureStorageBlobAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/AzureStorageBlobAutoConfiguration.java @@ -6,6 +6,7 @@ import com.azure.spring.cloud.autoconfigure.AzureServiceConfigurationBase; import com.azure.spring.cloud.autoconfigure.condition.ConditionalOnAnyProperty; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; +import com.azure.spring.cloud.autoconfigure.storage.blob.properties.AzureStorageBlobProperties; import com.azure.spring.service.storage.blob.BlobServiceClientBuilderFactory; import com.azure.storage.blob.BlobAsyncClient; import com.azure.storage.blob.BlobClient; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/AzureStorageBlobProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/properties/AzureStorageBlobProperties.java similarity index 96% rename from sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/AzureStorageBlobProperties.java rename to sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/properties/AzureStorageBlobProperties.java index 1c5411cf3316..584716bf5a14 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/AzureStorageBlobProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/properties/AzureStorageBlobProperties.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.autoconfigure.storage.blob; +package com.azure.spring.cloud.autoconfigure.storage.blob.properties; import com.azure.spring.cloud.autoconfigure.storage.common.AzureStorageProperties; import com.azure.spring.service.storage.blob.StorageBlobProperties; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/AzureStorageFileShareAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/AzureStorageFileShareAutoConfiguration.java index 452ac5b040c3..b549988ca048 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/AzureStorageFileShareAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/AzureStorageFileShareAutoConfiguration.java @@ -6,6 +6,7 @@ import com.azure.spring.cloud.autoconfigure.AzureServiceConfigurationBase; import com.azure.spring.cloud.autoconfigure.condition.ConditionalOnAnyProperty; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; +import com.azure.spring.cloud.autoconfigure.storage.fileshare.properties.AzureStorageFileShareProperties; import com.azure.spring.service.storage.fileshare.ShareServiceClientBuilderFactory; import com.azure.storage.file.share.ShareAsyncClient; import com.azure.storage.file.share.ShareClient; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/AzureStorageFileShareProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/properties/AzureStorageFileShareProperties.java similarity index 95% rename from sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/AzureStorageFileShareProperties.java rename to sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/properties/AzureStorageFileShareProperties.java index b8a292851047..25e39fbb69ee 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/AzureStorageFileShareProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/properties/AzureStorageFileShareProperties.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.autoconfigure.storage.fileshare; +package com.azure.spring.cloud.autoconfigure.storage.fileshare.properties; import com.azure.spring.cloud.autoconfigure.storage.common.AzureStorageProperties; import com.azure.spring.service.storage.fileshare.StorageFileShareProperties; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/queue/AzureStorageQueueAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/queue/AzureStorageQueueAutoConfiguration.java index 4029fa765dd7..0f67c583e876 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/queue/AzureStorageQueueAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/queue/AzureStorageQueueAutoConfiguration.java @@ -6,6 +6,7 @@ import com.azure.spring.cloud.autoconfigure.AzureServiceConfigurationBase; import com.azure.spring.cloud.autoconfigure.condition.ConditionalOnAnyProperty; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; +import com.azure.spring.cloud.autoconfigure.storage.queue.properties.AzureStorageQueueProperties; import com.azure.spring.core.connectionstring.ConnectionStringProvider; import com.azure.spring.core.connectionstring.StaticConnectionStringProvider; import com.azure.spring.core.service.AzureServiceType; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/queue/AzureStorageQueueProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/queue/properties/AzureStorageQueueProperties.java similarity index 95% rename from sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/queue/AzureStorageQueueProperties.java rename to sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/queue/properties/AzureStorageQueueProperties.java index e8b1b3d3be01..deb3f2d74816 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/queue/AzureStorageQueueProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/queue/properties/AzureStorageQueueProperties.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.autoconfigure.storage.queue; +package com.azure.spring.cloud.autoconfigure.storage.queue.properties; import com.azure.spring.cloud.autoconfigure.storage.common.AzureStorageProperties; import com.azure.spring.service.storage.queue.StorageQueueProperties; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/samples/java/com/azure/spring/cosmos/CosmosSampleApplication.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/samples/java/com/azure/spring/cosmos/CosmosSampleApplication.java index e2251eaa8ff8..68fb7b955abb 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/samples/java/com/azure/spring/cosmos/CosmosSampleApplication.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/samples/java/com/azure/spring/cosmos/CosmosSampleApplication.java @@ -3,7 +3,7 @@ package com.azure.spring.cosmos; import com.azure.core.credential.AzureKeyCredential; -import com.azure.spring.cloud.autoconfigure.cosmos.AzureCosmosProperties; +import com.azure.spring.cloud.autoconfigure.cosmos.properties.AzureCosmosProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBaseTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBaseTest.java new file mode 100644 index 000000000000..ba98ab8510f9 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBaseTest.java @@ -0,0 +1,198 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure; + +import com.azure.core.amqp.AmqpTransportType; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.cosmos.CosmosClientBuilder; +import com.azure.security.keyvault.secrets.SecretClientBuilder; +import com.azure.spring.cloud.autoconfigure.cosmos.AzureCosmosAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.cosmos.properties.AzureCosmosProperties; +import com.azure.spring.cloud.autoconfigure.eventhubs.AzureEventHubAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.eventhubs.properties.AzureEventHubProperties; +import com.azure.spring.cloud.autoconfigure.keyvault.secrets.AzureKeyVaultSecretAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.keyvault.secrets.properties.AzureKeyVaultSecretProperties; +import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; +import org.assertj.core.extractor.Extractors; +import org.assertj.core.util.introspection.IntrospectionError; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +import java.time.Duration; +import java.util.HashSet; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.mock; + +class AzureServiceConfigurationBaseTest { + + static final String TEST_ENDPOINT_HTTPS = "https://test.https.documents.azure.com:443/"; + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of( + AzureCosmosAutoConfiguration.class, + AzureKeyVaultSecretAutoConfiguration.class, + AzureEventHubAutoConfiguration.class)); + + @Test + void configureGlobalShouldApplyToAzureCosmosProperties() { + AzureGlobalProperties azureProperties = new AzureGlobalProperties(); + azureProperties.getCredential().setClientId("global-client-id"); + azureProperties.getCredential().setClientSecret("global-client-secret"); + azureProperties.getClient().setApplicationId("global-application-id"); + azureProperties.getClient().getAmqp().setTransportType(AmqpTransportType.AMQP_WEB_SOCKETS); + azureProperties.getClient().getHttp().setConnectTimeout(Duration.ofMinutes(1)); + azureProperties.getClient().getHttp().getLogging().setLevel(HttpLogDetailLevel.HEADERS); + azureProperties.getClient().getHttp().getLogging().getAllowedHeaderNames().add("abc"); + azureProperties.getProxy().setHostname("localhost"); + azureProperties.getProxy().getHttp().setNonProxyHosts("localhost"); + azureProperties.getRetry().getBackoff().setDelay(Duration.ofMillis(2)); + azureProperties.getRetry().setMaxAttempts(3); + azureProperties.getRetry().getHttp().setRetryAfterHeader("x-ms-xxx"); + + this.contextRunner + .withBean(AzureGlobalProperties.class, () -> azureProperties) + .withBean(CosmosClientBuilder.class, () -> mock(CosmosClientBuilder.class)) + .withPropertyValues( + "spring.cloud.azure.cosmos.endpoint=" + TEST_ENDPOINT_HTTPS, + "spring.cloud.azure.cosmos.key=cosmos-key" + ) + .run(context -> { + assertThat(context).hasSingleBean(AzureCosmosProperties.class); + final AzureCosmosProperties properties = context.getBean(AzureCosmosProperties.class); + assertThat(properties).extracting("credential.clientId").isEqualTo("global-client-id"); + assertThat(properties).extracting("credential.clientSecret").isEqualTo("global-client-secret"); + + assertThat(properties).extracting("client.applicationId").isEqualTo("global-application-id"); + + assertThat(properties).extracting("proxy.hostname").isEqualTo("localhost"); + assertThat(properties).extracting("proxy.nonProxyHosts").isEqualTo("localhost"); + + // retry configuration doesn't apply to cosmos client + assertThat(properties).extracting("retry.maxAttempts").isEqualTo(null); + assertThat(properties).extracting("retry.backoff.delay").isEqualTo(null); + + assertThat(properties).extracting("endpoint").isEqualTo(TEST_ENDPOINT_HTTPS); + assertThat(properties).extracting("key").isEqualTo("cosmos-key"); + + assertThatThrownBy(() -> Extractors.byName("client.transportType").apply(properties)) + .isInstanceOf(IntrospectionError.class); + assertThatThrownBy(() -> Extractors.byName("client.logging.allowedHeaderNames").apply(properties)) + .isInstanceOf(IntrospectionError.class); + assertThatThrownBy(() -> Extractors.byName("client.logging.level").apply(properties)) + .isInstanceOf(IntrospectionError.class); + assertThatThrownBy(() -> Extractors.byName("client.connectTimeout").apply(properties)) + .isInstanceOf(IntrospectionError.class); + assertThatThrownBy(() -> Extractors.byName("retry.retryAfterHeader").apply(properties)) + .isInstanceOf(IntrospectionError.class); + + }); + } + + @Test + void configureGlobalShouldApplyToAmqpAzureEventHubsProperties() { + AzureGlobalProperties azureProperties = new AzureGlobalProperties(); + azureProperties.getCredential().setClientId("global-client-id"); + azureProperties.getCredential().setClientSecret("global-client-secret"); + azureProperties.getClient().setApplicationId("global-application-id"); + azureProperties.getClient().getAmqp().setTransportType(AmqpTransportType.AMQP_WEB_SOCKETS); + azureProperties.getClient().getHttp().setConnectTimeout(Duration.ofMinutes(1)); + azureProperties.getClient().getHttp().getLogging().setLevel(HttpLogDetailLevel.HEADERS); + azureProperties.getClient().getHttp().getLogging().getAllowedHeaderNames().add("abc"); + azureProperties.getProxy().setHostname("localhost"); + azureProperties.getProxy().getHttp().setNonProxyHosts("localhost"); + azureProperties.getRetry().getBackoff().setDelay(Duration.ofMillis(2)); + azureProperties.getRetry().setMaxAttempts(3); + azureProperties.getRetry().getHttp().setRetryAfterHeader("x-ms-xxx"); + + this.contextRunner + .withBean(AzureGlobalProperties.class, () -> azureProperties) + .withPropertyValues( + "spring.cloud.azure.eventhubs.namespace=test" + ) + .run(context -> { + assertThat(context).hasSingleBean(AzureEventHubProperties.class); + final AzureEventHubProperties properties = context.getBean(AzureEventHubProperties.class); + assertThat(properties).extracting("credential.clientId").isEqualTo("global-client-id"); + assertThat(properties).extracting("credential.clientSecret").isEqualTo("global-client-secret"); + + assertThat(properties).extracting("client.applicationId").isEqualTo("global-application-id"); + assertThat(properties).extracting("client.transportType").isEqualTo(AmqpTransportType.AMQP_WEB_SOCKETS); + + assertThat(properties).extracting("proxy.hostname").isEqualTo("localhost"); + + assertThat(properties).extracting("retry.maxAttempts").isEqualTo(3); + assertThat(properties).extracting("retry.backoff.delay").isEqualTo(Duration.ofMillis(2)); + + assertThat(properties).extracting("namespace").isEqualTo("test"); + + assertThatThrownBy(() -> Extractors.byName("client.connectTimeout").apply(properties)) + .isInstanceOf(IntrospectionError.class); + assertThatThrownBy(() -> Extractors.byName("client.logging.level").apply(properties)) + .isInstanceOf(IntrospectionError.class); + assertThatThrownBy(() -> Extractors.byName("client.logging.allowedHeaderNames").apply(properties)) + .isInstanceOf(IntrospectionError.class); + assertThatThrownBy(() -> Extractors.byName("proxy.nonProxyHosts").apply(properties)) + .isInstanceOf(IntrospectionError.class); + assertThatThrownBy(() -> Extractors.byName("retry.retryAfterHeader").apply(properties)) + .isInstanceOf(IntrospectionError.class); + + }); + } + + @Test + void configureGlobalShouldApplyToHttpAzureKeyVaultSecretProperties() { + AzureGlobalProperties azureProperties = new AzureGlobalProperties(); + azureProperties.getCredential().setClientId("global-client-id"); + azureProperties.getCredential().setClientSecret("global-client-secret"); + azureProperties.getClient().setApplicationId("global-application-id"); + azureProperties.getClient().getAmqp().setTransportType(AmqpTransportType.AMQP_WEB_SOCKETS); + azureProperties.getClient().getHttp().setConnectTimeout(Duration.ofMinutes(1)); + azureProperties.getClient().getHttp().getLogging().setLevel(HttpLogDetailLevel.HEADERS); + azureProperties.getClient().getHttp().getLogging().getAllowedHeaderNames().add("abc"); + azureProperties.getProxy().setHostname("localhost"); + azureProperties.getProxy().getHttp().setNonProxyHosts("localhost"); + azureProperties.getRetry().getBackoff().setDelay(Duration.ofMillis(2)); + azureProperties.getRetry().setMaxAttempts(3); + azureProperties.getRetry().getHttp().setRetryAfterHeader("x-ms-xxx"); + + this.contextRunner + .withBean(AzureGlobalProperties.class, () -> azureProperties) + .withBean(SecretClientBuilder.class, () -> mock(SecretClientBuilder.class)) + .withPropertyValues( + "spring.cloud.azure.keyvault.secret.endpoint=test" + ) + .run(context -> { + assertThat(context).hasSingleBean(AzureKeyVaultSecretProperties.class); + final AzureKeyVaultSecretProperties properties = context.getBean(AzureKeyVaultSecretProperties.class); + assertThat(properties).extracting("credential.clientId").isEqualTo("global-client-id"); + assertThat(properties).extracting("credential.clientSecret").isEqualTo("global-client-secret"); + + assertThat(properties).extracting("client.applicationId").isEqualTo("global-application-id"); + assertThat(properties).extracting("client.connectTimeout").isEqualTo(Duration.ofMinutes(1)); + assertThat(properties).extracting("client.logging.level").isEqualTo(HttpLogDetailLevel.HEADERS); + Set allowedHeaderNames = new HashSet<>(); + allowedHeaderNames.add("abc"); + assertThat(properties).extracting("client.logging.allowedHeaderNames").isEqualTo(allowedHeaderNames); + + assertThat(properties).extracting("proxy.hostname").isEqualTo("localhost"); + assertThat(properties).extracting("proxy.nonProxyHosts").isEqualTo("localhost"); + + assertThat(properties).extracting("retry.maxAttempts").isEqualTo(3); + assertThat(properties).extracting("retry.retryAfterHeader").isEqualTo("x-ms-xxx"); + assertThat(properties).extracting("retry.backoff.delay").isEqualTo(Duration.ofMillis(2)); + + assertThat(properties).extracting("endpoint").isEqualTo("test"); + + assertThatThrownBy(() -> Extractors.byName("client.transportType").apply(properties)) + .isInstanceOf(IntrospectionError.class); + + }); + } + + +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/appconfiguration/AzureAppConfigurationAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/appconfiguration/AzureAppConfigurationAutoConfigurationTest.java index e49b688f9165..0870d29e8fea 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/appconfiguration/AzureAppConfigurationAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/appconfiguration/AzureAppConfigurationAutoConfigurationTest.java @@ -6,6 +6,7 @@ import com.azure.data.appconfiguration.ConfigurationAsyncClient; import com.azure.data.appconfiguration.ConfigurationClient; import com.azure.data.appconfiguration.ConfigurationClientBuilder; +import com.azure.spring.cloud.autoconfigure.appconfiguration.properties.AzureAppConfigurationProperties; import com.azure.spring.cloud.autoconfigure.keyvault.secrets.AzureKeyVaultSecretAutoConfiguration; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import com.azure.spring.service.appconfiguration.ConfigurationClientBuilderFactory; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java index 8551303ce0e3..d243cd66f8e7 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java @@ -3,19 +3,40 @@ package com.azure.spring.cloud.autoconfigure.context; -import org.junit.jupiter.api.Assertions; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.spring.cloud.autoconfigure.eventhubs.properties.AzureEventHubProperties; +import com.azure.spring.cloud.autoconfigure.keyvault.secrets.properties.AzureKeyVaultSecretProperties; +import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import org.junit.jupiter.api.Test; import org.springframework.boot.SpringApplication; import org.springframework.boot.WebApplicationType; import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.context.properties.bind.Binder; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.PropertiesPropertySource; +import java.time.Duration; import java.util.Properties; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_AUTHORITY_HOST; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_CLIENT_CERTIFICATE_PATH; import static com.azure.core.util.Configuration.PROPERTY_AZURE_CLIENT_ID; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_CLIENT_SECRET; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_CLOUD; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_HTTP_LOG_DETAIL_LEVEL; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_PASSWORD; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_CONNECT_TIMEOUT; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_READ_TIMEOUT; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_RESPONSE_TIMEOUT; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_RETRY_COUNT; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_WRITE_TIMEOUT; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_SUBSCRIPTION_ID; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_TENANT_ID; +import static com.azure.core.util.Configuration.PROPERTY_AZURE_USERNAME; +import static com.azure.core.util.Configuration.PROPERTY_NO_PROXY; +import static org.junit.jupiter.api.Assertions.assertEquals; class AzureGlobalConfigurationEnvironmentPostProcessorTest { @@ -25,19 +46,29 @@ void springPropertyShouldHaveValueIfAzureCoreEnvSet() { ConfigurableEnvironment environment = getEnvironment(propertiesPropertySource); - Assertions.assertEquals("test-client-id", environment.getProperty(PROPERTY_AZURE_CLIENT_ID)); - Assertions.assertEquals("test-client-id", environment.getProperty("spring.cloud.azure.credential.client-id")); + assertEquals("test-client-id", environment.getProperty(PROPERTY_AZURE_CLIENT_ID)); + assertEquals("test-client-id", environment.getProperty("spring.cloud.azure.credential.client-id")); } @Test - void springPropertyShouldHaveValueIfAzureSdkEnvSet() { + void springPropertyShouldHaveValueIfAzureKeyVaultEnvSet() { PropertiesPropertySource propertiesPropertySource = buildTestProperties("AZURE_KEYVAULT_ENDPOINT", "test-endpoint"); ConfigurableEnvironment environment = getEnvironment(propertiesPropertySource); - Assertions.assertEquals("test-endpoint", environment.getProperty("AZURE_KEYVAULT_ENDPOINT")); - Assertions.assertEquals("test-endpoint", environment.getProperty("spring.cloud.azure.keyvault.secret.endpoint")); - Assertions.assertEquals("test-endpoint", environment.getProperty("spring.cloud.azure.keyvault.certificate.endpoint")); + assertEquals("test-endpoint", environment.getProperty("AZURE_KEYVAULT_ENDPOINT")); + assertEquals("test-endpoint", environment.getProperty("spring.cloud.azure.keyvault.secret.endpoint")); + assertEquals("test-endpoint", environment.getProperty("spring.cloud.azure.keyvault.certificate.endpoint")); + } + + @Test + void springPropertyShouldHaveValueIfAzureEventHubsEnvSet() { + PropertiesPropertySource propertiesPropertySource = buildTestProperties("AZURE_EVENT_HUBS_CONNECTION_STRING", "test-connection-string"); + + ConfigurableEnvironment environment = getEnvironment(propertiesPropertySource); + + assertEquals("test-connection-string", environment.getProperty("AZURE_EVENT_HUBS_CONNECTION_STRING")); + assertEquals("test-connection-string", environment.getProperty("spring.cloud.azure.eventhubs.connection-string")); } @Test @@ -49,8 +80,8 @@ void azureCoreEnvShouldNotBeTakenIfSpringPropertiesSet() { ConfigurableEnvironment environment = getEnvironment(propertiesPropertySource); - Assertions.assertEquals("core-client-id", environment.getProperty(PROPERTY_AZURE_CLIENT_ID)); - Assertions.assertEquals("spring-client-id", environment.getProperty("spring.cloud.azure.credential.client-id")); + assertEquals("core-client-id", environment.getProperty(PROPERTY_AZURE_CLIENT_ID)); + assertEquals("spring-client-id", environment.getProperty("spring.cloud.azure.credential.client-id")); } @Test @@ -62,10 +93,71 @@ void azureSdkEnvShouldNotBeTakenIfSpringPropertiesSet() { ConfigurableEnvironment environment = getEnvironment(propertiesPropertySource); - Assertions.assertEquals("sdk-endpoint", environment.getProperty("AZURE_KEYVAULT_ENDPOINT")); - Assertions.assertEquals("spring-endpoint", environment.getProperty("spring.cloud.azure.keyvault.secret.endpoint")); + assertEquals("sdk-endpoint", environment.getProperty("AZURE_KEYVAULT_ENDPOINT")); + assertEquals("spring-endpoint", environment.getProperty("spring.cloud.azure.keyvault.secret.endpoint")); + } + + @Test + void azureCoreEnvShouldBindCorrect() { + Properties properties = new Properties(); + properties.put(PROPERTY_AZURE_CLIENT_ID, "core-client-id"); + properties.put(PROPERTY_AZURE_CLIENT_SECRET, "core-client-secret"); + properties.put(PROPERTY_AZURE_CLIENT_CERTIFICATE_PATH, "core-client-cert-path"); + properties.put(PROPERTY_AZURE_USERNAME, "core-username"); + properties.put(PROPERTY_AZURE_PASSWORD, "core-password"); + properties.put(PROPERTY_AZURE_TENANT_ID, "core-tenant-id"); + properties.put(PROPERTY_AZURE_SUBSCRIPTION_ID, "core-sub-id"); + properties.put(PROPERTY_AZURE_CLOUD, "azure_china"); + properties.put(PROPERTY_AZURE_AUTHORITY_HOST, "aad"); + properties.put(PROPERTY_AZURE_REQUEST_RETRY_COUNT, 3); + properties.put(PROPERTY_AZURE_HTTP_LOG_DETAIL_LEVEL, "headers"); + properties.put(PROPERTY_AZURE_REQUEST_CONNECT_TIMEOUT, 1000); + properties.put(PROPERTY_AZURE_REQUEST_READ_TIMEOUT, 2000); + properties.put(PROPERTY_AZURE_REQUEST_WRITE_TIMEOUT, 3000); + properties.put(PROPERTY_AZURE_REQUEST_RESPONSE_TIMEOUT, 4000); + properties.put(PROPERTY_NO_PROXY, "localhost"); + + PropertiesPropertySource propertiesPropertySource = new PropertiesPropertySource("test-properties", properties); + + ConfigurableEnvironment environment = getEnvironment(propertiesPropertySource); + AzureGlobalProperties globalProperties = Binder.get(environment).bind(AzureGlobalProperties.PREFIX, AzureGlobalProperties.class).get(); + + assertEquals("core-client-id", globalProperties.getCredential().getClientId()); + assertEquals("core-client-secret", globalProperties.getCredential().getClientSecret()); + assertEquals("core-client-cert-path", globalProperties.getCredential().getClientCertificatePath()); + assertEquals("core-username", globalProperties.getCredential().getUsername()); + assertEquals("core-password", globalProperties.getCredential().getPassword()); + assertEquals("core-tenant-id", globalProperties.getProfile().getTenantId()); + assertEquals("core-sub-id", globalProperties.getProfile().getSubscriptionId()); + assertEquals("azure_china", globalProperties.getProfile().getCloud()); + assertEquals("aad", globalProperties.getProfile().getEnvironment().getActiveDirectoryEndpoint()); + assertEquals(3, globalProperties.getRetry().getMaxAttempts()); + assertEquals(HttpLogDetailLevel.HEADERS, globalProperties.getClient().getHttp().getLogging().getLevel()); + assertEquals(Duration.ofSeconds(1), globalProperties.getClient().getHttp().getConnectTimeout()); + assertEquals(Duration.ofSeconds(2), globalProperties.getClient().getHttp().getReadTimeout()); + assertEquals(Duration.ofSeconds(3), globalProperties.getClient().getHttp().getWriteTimeout()); + assertEquals(Duration.ofSeconds(4), globalProperties.getClient().getHttp().getResponseTimeout()); + assertEquals("localhost", globalProperties.getProxy().getHttp().getNonProxyHosts()); + } + @Test + void azureSdkEnvShouldBindCorrect() { + Properties properties = new Properties(); + properties.put("AZURE_KEYVAULT_ENDPOINT", "test-endpoint"); + properties.put("AZURE_EVENT_HUBS_CONNECTION_STRING", "test-connection-str"); + + PropertiesPropertySource propertiesPropertySource = new PropertiesPropertySource("test-properties", properties); + + ConfigurableEnvironment environment = getEnvironment(propertiesPropertySource); + AzureEventHubProperties eventHubProperties = Binder.get(environment).bind(AzureEventHubProperties.PREFIX, AzureEventHubProperties.class).get(); + AzureKeyVaultSecretProperties keyVaultSecretProperties = Binder.get(environment).bind(AzureKeyVaultSecretProperties.PREFIX, AzureKeyVaultSecretProperties.class).get(); + + assertEquals("test-connection-str", eventHubProperties.getConnectionString()); + assertEquals("test-endpoint", keyVaultSecretProperties.getEndpoint()); + } + + private PropertiesPropertySource buildTestProperties(String key, String value) { Properties properties = new Properties(); properties.put(key, value); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosAutoConfigurationTest.java index 9aa21b382eb2..15f6a9f7740d 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosAutoConfigurationTest.java @@ -6,6 +6,7 @@ import com.azure.cosmos.CosmosAsyncClient; import com.azure.cosmos.CosmosClient; import com.azure.cosmos.CosmosClientBuilder; +import com.azure.spring.cloud.autoconfigure.cosmos.properties.AzureCosmosProperties; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import com.azure.spring.service.cosmos.CosmosClientBuilderFactory; import org.junit.jupiter.api.Test; @@ -72,6 +73,7 @@ void configureAzureCosmosProperties() { azureProperties.getCredential().setClientId("azure-client-id"); azureProperties.getCredential().setClientSecret("azure-client-secret"); azureProperties.getProxy().setHostname("localhost"); + azureProperties.getProxy().getHttp().setNonProxyHosts("localhost"); this.contextRunner .withBean(AzureGlobalProperties.class, () -> azureProperties) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosPropertiesTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosPropertiesTest.java index 2aab92ca970f..e42338d89ea2 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosPropertiesTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/cosmos/AzureCosmosPropertiesTest.java @@ -3,6 +3,7 @@ package com.azure.spring.cloud.autoconfigure.cosmos; +import com.azure.spring.cloud.autoconfigure.cosmos.properties.AzureCosmosProperties; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/jms/AbstractServiceBusJmsAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/jms/AbstractServiceBusJmsAutoConfigurationTest.java index 909dfb6aa243..27ba4b58e4a3 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/jms/AbstractServiceBusJmsAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/jms/AbstractServiceBusJmsAutoConfigurationTest.java @@ -3,6 +3,7 @@ package com.azure.spring.cloud.autoconfigure.jms; +import com.azure.spring.cloud.autoconfigure.jms.properties.AzureServiceBusJmsProperties; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/jms/NonPremiumServiceBusJmsAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/jms/NonPremiumServiceBusJmsAutoConfigurationTest.java index 4baf69e9e79f..ccf7e3a6232c 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/jms/NonPremiumServiceBusJmsAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/jms/NonPremiumServiceBusJmsAutoConfigurationTest.java @@ -3,6 +3,7 @@ package com.azure.spring.cloud.autoconfigure.jms; +import com.azure.spring.cloud.autoconfigure.jms.properties.AzureServiceBusJmsProperties; import org.apache.qpid.jms.JmsConnectionFactory; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/jms/PremiumServiceBusJmsAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/jms/PremiumServiceBusJmsAutoConfigurationTest.java index 1ff53138741f..237688d17f7c 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/jms/PremiumServiceBusJmsAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/jms/PremiumServiceBusJmsAutoConfigurationTest.java @@ -3,6 +3,7 @@ package com.azure.spring.cloud.autoconfigure.jms; +import com.azure.spring.cloud.autoconfigure.jms.properties.AzureServiceBusJmsProperties; import com.microsoft.azure.servicebus.jms.ServiceBusJmsConnectionFactory; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultSecretAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultSecretAutoConfigurationTest.java index e160c33b88ac..d15f5984dea4 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultSecretAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultSecretAutoConfigurationTest.java @@ -6,6 +6,7 @@ import com.azure.security.keyvault.secrets.SecretAsyncClient; import com.azure.security.keyvault.secrets.SecretClient; import com.azure.security.keyvault.secrets.SecretClientBuilder; +import com.azure.spring.cloud.autoconfigure.keyvault.secrets.properties.AzureKeyVaultSecretProperties; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import com.azure.spring.service.keyvault.secrets.SecretClientBuilderFactory; import org.junit.jupiter.api.Test; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/storage/blob/AzureStorageBlobAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/storage/blob/AzureStorageBlobAutoConfigurationTest.java index 7d0e7346d626..34be441603cf 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/storage/blob/AzureStorageBlobAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/storage/blob/AzureStorageBlobAutoConfigurationTest.java @@ -4,6 +4,7 @@ package com.azure.spring.cloud.autoconfigure.storage.blob; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; +import com.azure.spring.cloud.autoconfigure.storage.blob.properties.AzureStorageBlobProperties; import com.azure.spring.service.storage.blob.BlobServiceClientBuilderFactory; import com.azure.storage.blob.BlobServiceAsyncClient; import com.azure.storage.blob.BlobServiceClient; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/AzureStorageFileShareAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/AzureStorageFileShareAutoConfigurationTest.java index 2debde3d4d8c..54b76e57e1d6 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/AzureStorageFileShareAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/storage/fileshare/AzureStorageFileShareAutoConfigurationTest.java @@ -4,6 +4,7 @@ package com.azure.spring.cloud.autoconfigure.storage.fileshare; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; +import com.azure.spring.cloud.autoconfigure.storage.fileshare.properties.AzureStorageFileShareProperties; import com.azure.spring.service.storage.fileshare.ShareServiceClientBuilderFactory; import com.azure.storage.file.share.ShareServiceAsyncClient; import com.azure.storage.file.share.ShareServiceClient; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/storage/queue/AzureStorageQueueAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/storage/queue/AzureStorageQueueAutoConfigurationTest.java index 73ff6fbb08e0..ae9b056695ec 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/storage/queue/AzureStorageQueueAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/storage/queue/AzureStorageQueueAutoConfigurationTest.java @@ -4,6 +4,7 @@ package com.azure.spring.cloud.autoconfigure.storage.queue; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; +import com.azure.spring.cloud.autoconfigure.storage.queue.properties.AzureStorageQueueProperties; import com.azure.spring.service.storage.queue.QueueServiceClientBuilderFactory; import com.azure.storage.queue.QueueServiceAsyncClient; import com.azure.storage.queue.QueueServiceClient; diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/ClientAware.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/ClientAware.java index 411eec2cb162..c0543812a7c8 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/ClientAware.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/ClientAware.java @@ -27,8 +27,6 @@ interface Client { List getHeaders(); - Logging getLogging(); - } /** @@ -48,22 +46,25 @@ interface HttpClient extends Client { Duration getConnectionIdleTimeout(); + HttpLogging getLogging(); + } /** * Interface to be implemented by classes that wish to describe am amqp based client sdk. */ interface AmqpClient extends Client { + AmqpTransportType getTransportType(); } /** - * Interface to be implemented by classes that wish to describe logging options in client sdk. + * Interface to be implemented by classes that wish to describe logging options in http-based client sdks. * * For example, if you want to log the http request or response, you could set the level to * {@link HttpLogDetailLevel#BASIC} or some other levels. */ - interface Logging { + interface HttpLogging { HttpLogDetailLevel getLevel(); diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureHttpLogOptionsConverter.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureHttpLogOptionsConverter.java index 950741fdd4ee..431cbd9e0d67 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureHttpLogOptionsConverter.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureHttpLogOptionsConverter.java @@ -8,14 +8,14 @@ import org.springframework.core.convert.converter.Converter; /** - * Converts a {@link ClientAware.Logging} to a {@link HttpLogOptions}. + * Converts a {@link ClientAware.HttpLogging} to a {@link HttpLogOptions}. */ -public final class AzureHttpLogOptionsConverter implements Converter { +public final class AzureHttpLogOptionsConverter implements Converter { public static final AzureHttpLogOptionsConverter HTTP_LOG_OPTIONS_CONVERTER = new AzureHttpLogOptionsConverter(); @Override - public HttpLogOptions convert(ClientAware.Logging logging) { + public HttpLogOptions convert(ClientAware.HttpLogging logging) { HttpLogOptions logOptions = new HttpLogOptions(); logOptions.setLogLevel(logging.getLevel()); diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AbstractAzureHttpClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AbstractAzureHttpClientBuilderFactory.java index 619ba4cc78f9..131835251d1c 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AbstractAzureHttpClientBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AbstractAzureHttpClientBuilderFactory.java @@ -102,8 +102,15 @@ protected void configureHttpHeaders(T builder) { protected void configureHttpLogOptions(T builder) { ClientAware.Client client = getAzureProperties().getClient(); - HttpLogOptions logOptions = HTTP_LOG_OPTIONS_CONVERTER.convert(client.getLogging()); - consumeHttpLogOptions().accept(builder, logOptions); + + if (client instanceof HttpClient) { + HttpLogOptions logOptions = + HTTP_LOG_OPTIONS_CONVERTER.convert(((ClientAware.HttpClient) client).getLogging()); + consumeHttpLogOptions().accept(builder, logOptions); + } else { + LOGGER.warn("The client properties of an http-based client is of type {}", client.getClass().getName()); + } + } protected void configureHttpTransportProperties(T builder) { diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzurePropertiesUtils.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzurePropertiesUtils.java index 5f3744009c09..7c5176fcd89a 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzurePropertiesUtils.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzurePropertiesUtils.java @@ -3,6 +3,7 @@ package com.azure.spring.core.properties; +import com.azure.spring.core.aware.ClientAware; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; @@ -25,6 +26,16 @@ public class AzurePropertiesUtils { public static void copyAzureCommonProperties(AzureProperties source, T target) { // call explicitly for these fields could be defined as final BeanUtils.copyProperties(source.getClient(), target.getClient()); + + if (source.getClient() instanceof ClientAware.HttpClient + && target.getClient() instanceof ClientAware.HttpClient) { + ClientAware.HttpClient sourceClient = (ClientAware.HttpClient) source.getClient(); + ClientAware.HttpClient targetClient = (ClientAware.HttpClient) target.getClient(); + BeanUtils.copyProperties(sourceClient.getLogging(), targetClient.getLogging()); + targetClient.getLogging().getAllowedHeaderNames().addAll(sourceClient.getLogging().getAllowedHeaderNames()); + targetClient.getLogging().getAllowedQueryParamNames().addAll(sourceClient.getLogging().getAllowedQueryParamNames()); + } + BeanUtils.copyProperties(source.getProxy(), target.getProxy()); BeanUtils.copyProperties(source.getRetry(), target.getRetry()); BeanUtils.copyProperties(source.getRetry().getBackoff(), target.getRetry().getBackoff()); @@ -35,6 +46,16 @@ public static void copyAzureCommonProperties(AzurePr // TODO (xiada): add tests for this public static void copyAzureCommonPropertiesIgnoreNull(AzureProperties source, T target) { copyPropertiesIgnoreNull(source.getClient(), target.getClient()); + + if (source.getClient() instanceof ClientAware.HttpClient + && target.getClient() instanceof ClientAware.HttpClient) { + ClientAware.HttpClient sourceClient = (ClientAware.HttpClient) source.getClient(); + ClientAware.HttpClient targetClient = (ClientAware.HttpClient) target.getClient(); + copyPropertiesIgnoreNull(sourceClient.getLogging(), targetClient.getLogging()); + targetClient.getLogging().getAllowedHeaderNames().addAll(sourceClient.getLogging().getAllowedHeaderNames()); + targetClient.getLogging().getAllowedQueryParamNames().addAll(sourceClient.getLogging().getAllowedQueryParamNames()); + } + copyPropertiesIgnoreNull(source.getProxy(), target.getProxy()); copyPropertiesIgnoreNull(source.getRetry(), target.getRetry()); copyPropertiesIgnoreNull(source.getRetry().getBackoff(), target.getRetry().getBackoff()); diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/ClientProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/ClientProperties.java index 2cdf879105e1..83d48bd005da 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/ClientProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/ClientProperties.java @@ -17,8 +17,6 @@ public class ClientProperties implements ClientAware.Client { private final List headers = new ArrayList<>(); - private final LoggingProperties logging = new LoggingProperties(); - public String getApplicationId() { return applicationId; } @@ -31,8 +29,4 @@ public List getHeaders() { return headers; } - public LoggingProperties getLogging() { - return logging; - } - } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/HttpClientProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/HttpClientProperties.java index 39db40c96d00..d92cdece3594 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/HttpClientProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/HttpClientProperties.java @@ -18,6 +18,7 @@ public final class HttpClientProperties extends ClientProperties implements Clie private Duration connectTimeout; private Duration connectionIdleTimeout; private Integer maximumConnectionPoolSize; + private final LoggingProperties logging = new LoggingProperties(); public Duration getWriteTimeout() { return writeTimeout; @@ -69,4 +70,9 @@ public Duration getConnectionIdleTimeout() { public void setConnectionIdleTimeout(Duration connectionIdleTimeout) { this.connectionIdleTimeout = connectionIdleTimeout; } + + @Override + public LoggingProperties getLogging() { + return logging; + } } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/LoggingProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/LoggingProperties.java index 5116f2b4228f..0321da7f7a4c 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/LoggingProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/LoggingProperties.java @@ -13,7 +13,7 @@ * Options related to http logging. For example, if you want to log the http request or response, you could set the * level to {@link HttpLogDetailLevel#BASIC} or some other levels. */ -public class LoggingProperties implements ClientAware.Logging { +public class LoggingProperties implements ClientAware.HttpLogging { private HttpLogDetailLevel level; private final Set allowedHeaderNames = new HashSet<>(); From 8a0b09deee558e5fd897d1f3808b5d5c26036713 Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Tue, 9 Nov 2021 12:20:06 +0800 Subject: [PATCH 02/15] try to fix ci --- .../AzureGlobalConfigurationEnvironmentPostProcessor.java | 6 ++---- ...zureGlobalConfigurationEnvironmentPostProcessorTest.java | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java index a704fe09238a..08bc35ce05f9 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java @@ -81,8 +81,7 @@ enum AzureCoreEnvMapping { httpResponseTimeout(PROPERTY_AZURE_REQUEST_RESPONSE_TIMEOUT, "client.http.response-timeout", convertMillisToDuration()), - httpNoProxy(PROPERTY_NO_PROXY, "proxy.http.non-proxy-hosts") - ; + httpNoProxy(PROPERTY_NO_PROXY, "proxy.http.non-proxy-hosts"); // TODO (xiada): how to set this proxy? @@ -118,8 +117,7 @@ private static Function convertMillisToDuration() { enum AzureSdkEnvMapping { keyVaultSecretEndpoint("AZURE_KEYVAULT_ENDPOINT", "keyvault.secret.endpoint"), keyVaultCertificateEndpoint("AZURE_KEYVAULT_ENDPOINT", "keyvault.certificate.endpoint"), - eventHubsConnectionString("AZURE_EVENT_HUBS_CONNECTION_STRING", "eventhubs.connection-string") - ; + eventHubsConnectionString("AZURE_EVENT_HUBS_CONNECTION_STRING", "eventhubs.connection-string"); private final String sdkEnvName; private final String springPropertyName; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java index d243cd66f8e7..eb31388d779d 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java @@ -8,6 +8,7 @@ import com.azure.spring.cloud.autoconfigure.keyvault.secrets.properties.AzureKeyVaultSecretProperties; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; import org.springframework.boot.SpringApplication; import org.springframework.boot.WebApplicationType; import org.springframework.boot.builder.SpringApplicationBuilder; @@ -37,7 +38,9 @@ import static com.azure.core.util.Configuration.PROPERTY_AZURE_USERNAME; import static com.azure.core.util.Configuration.PROPERTY_NO_PROXY; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.parallel.ExecutionMode.SAME_THREAD; +@Execution(SAME_THREAD) class AzureGlobalConfigurationEnvironmentPostProcessorTest { @Test From cdc8703e43a6305befb7d73e93cc21a382ff59eb Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Tue, 9 Nov 2021 14:43:03 +0800 Subject: [PATCH 03/15] try to fix ci --- ...ConfigurationEnvironmentPostProcessor.java | 41 +++++++---- ...igurationEnvironmentPostProcessorTest.java | 72 ++++++++++++++----- ...GlobalPropertiesAutoConfigurationTest.java | 37 ---------- 3 files changed, 82 insertions(+), 68 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java index 08bc35ce05f9..40149754ae14 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java @@ -3,8 +3,7 @@ package com.azure.spring.cloud.autoconfigure.context; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.Log; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.Ordered; @@ -39,7 +38,12 @@ */ public class AzureGlobalConfigurationEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered { - private static final Logger LOGGER = LoggerFactory.getLogger(AzureGlobalConfigurationEnvironmentPostProcessor.class); + private final Log logger; + + public AzureGlobalConfigurationEnvironmentPostProcessor(Log logger) { + this.logger = logger; + AzureCoreEnvMapping.setLogger(logger); + } @Override public int getOrder() { @@ -87,7 +91,7 @@ enum AzureCoreEnvMapping { // TODO (xiada): how to set this proxy? // proxy(PROPERTY_HTTP_PROXY, PROPERTY_HTTPS_PROXY) - + private static Log logger; private final String coreEnvName; private final String springPropertyName; private final Function converter; @@ -101,17 +105,24 @@ enum AzureCoreEnvMapping { this.springPropertyName = "spring.cloud.azure." + springPropertyName; this.converter = converter; } - } - private static Function convertMillisToDuration() { - return ms -> { - try { - return Duration.ofMillis(Integer.parseInt(ms)).toString(); - } catch (Exception ignore) { - LOGGER.debug("The millisecond value {} is malformed.", ms); - return null; - } - }; + private static Function convertMillisToDuration() { + return ms -> { + try { + return Duration.ofMillis(Integer.parseInt(ms)).toString(); + } catch (Exception ignore) { + if (logger != null) { + logger.debug("The millisecond value " + ms + " is malformed."); + } + return null; + } + }; + } + + public static void setLogger(Log logger) { + AzureCoreEnvMapping.logger = logger; + } + } enum AzureSdkEnvMapping { @@ -154,7 +165,7 @@ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringAp if (!source.isEmpty()) { environment.getPropertySources().addLast(new AzureCoreEnvPropertySource("Azure Core/SDK", source)); } else { - LOGGER.debug("No env predefined by Azure Core/SDKs are set, skip adding the AzureCoreEnvPropertySource."); + logger.debug("No env predefined by Azure Core/SDKs are set, skip adding the AzureCoreEnvPropertySource."); } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java index eb31388d779d..e69c53c9c3ae 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java @@ -4,19 +4,21 @@ package com.azure.spring.cloud.autoconfigure.context; import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.core.management.AzureEnvironment; import com.azure.spring.cloud.autoconfigure.eventhubs.properties.AzureEventHubProperties; import com.azure.spring.cloud.autoconfigure.keyvault.secrets.properties.AzureKeyVaultSecretProperties; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.parallel.Execution; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.WebApplicationType; -import org.springframework.boot.builder.SpringApplicationBuilder; +import org.junit.jupiter.api.parallel.ExecutionMode; +import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.boot.env.EnvironmentPostProcessor; -import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.boot.logging.DeferredLog; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.PropertiesPropertySource; +import org.springframework.web.context.support.StandardServletEnvironment; import java.time.Duration; import java.util.Properties; @@ -37,10 +39,10 @@ import static com.azure.core.util.Configuration.PROPERTY_AZURE_TENANT_ID; import static com.azure.core.util.Configuration.PROPERTY_AZURE_USERNAME; import static com.azure.core.util.Configuration.PROPERTY_NO_PROXY; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.parallel.ExecutionMode.SAME_THREAD; -@Execution(SAME_THREAD) +@Execution(ExecutionMode.SAME_THREAD) class AzureGlobalConfigurationEnvironmentPostProcessorTest { @Test @@ -174,26 +176,64 @@ private ConfigurableEnvironment getEnvironment(PropertiesPropertySource properti private ConfigurableEnvironment getEnvironment(PropertiesPropertySource propertiesPropertySource, EnvironmentPostProcessor environmentPostProcessor) { - SpringApplication springApplication = new SpringApplicationBuilder() - .sources(AzureGlobalConfigurationEnvironmentPostProcessorTest.class) - .web(WebApplicationType.NONE).build(); - ConfigurableApplicationContext context = springApplication.run(); + ConfigurableEnvironment environment = new StandardServletEnvironment(); if (propertiesPropertySource != null) { - context.getEnvironment().getPropertySources().addFirst(propertiesPropertySource); + environment.getPropertySources().addFirst(propertiesPropertySource); } if (environmentPostProcessor == null) { - environmentPostProcessor = new AzureGlobalConfigurationEnvironmentPostProcessor(); + environmentPostProcessor = new AzureGlobalConfigurationEnvironmentPostProcessor(new DeferredLog()); } - environmentPostProcessor.postProcessEnvironment(context.getEnvironment(), springApplication); + environmentPostProcessor.postProcessEnvironment(environment, null); - ConfigurableEnvironment configurableEnvironment = context.getEnvironment(); - context.close(); + return environment; + } - return configurableEnvironment; + /** + * Move the testAzureProperties() to this test class for the JavaBeanBinder.Bean.cached will cache the binding + * result, when this test case was put in AzureGlobalPropertiesAutoConfigurationTest, and it ran concurrently with + * this class, which uses Binder, it would just fail occasionally. + */ + @Test + void testAzureProperties() { + final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(AzureGlobalPropertiesAutoConfiguration.class)); + + contextRunner + .withPropertyValues( + "spring.cloud.azure.client.application-id=fake-application-id", + "spring.cloud.azure.credential.client-id=fake-client-id", + "spring.cloud.azure.credential.client-secret=fake-client-secret", + "spring.cloud.azure.credential.username=fake-username", + "spring.cloud.azure.credential.password=fake-password", + "spring.cloud.azure.proxy.hostname=proxy-host", + "spring.cloud.azure.proxy.port=8888", + "spring.cloud.azure.retry.timeout=200s", + "spring.cloud.azure.retry.backoff.delay=20s", + "spring.cloud.azure.profile.tenant-id=fake-tenant-id", + "spring.cloud.azure.profile.subscription-id=fake-sub-id", + "spring.cloud.azure.profile.cloud=azure_china" + ) + .run(context -> { + final AzureGlobalProperties azureProperties = context.getBean(AzureGlobalProperties.class); + assertThat(azureProperties).extracting("client.applicationId").isEqualTo("fake-application-id"); + assertThat(azureProperties).extracting("credential.clientId").isEqualTo("fake-client-id"); + assertThat(azureProperties).extracting("credential.clientSecret").isEqualTo("fake-client-secret"); + assertThat(azureProperties).extracting("credential.username").isEqualTo("fake-username"); + assertThat(azureProperties).extracting("credential.password").isEqualTo("fake-password"); + assertThat(azureProperties).extracting("proxy.hostname").isEqualTo("proxy-host"); + assertThat(azureProperties).extracting("proxy.port").isEqualTo(8888); + assertThat(azureProperties).extracting("retry.timeout").isEqualTo(Duration.ofSeconds(200)); + assertThat(azureProperties).extracting("retry.backoff.delay").isEqualTo(Duration.ofSeconds(20)); + assertThat(azureProperties).extracting("profile.tenantId").isEqualTo("fake-tenant-id"); + assertThat(azureProperties).extracting("profile.subscriptionId").isEqualTo("fake-sub-id"); + assertThat(azureProperties).extracting("profile.cloud").isEqualTo("azure_china"); + assertThat(azureProperties).extracting("profile.environment.activeDirectoryEndpoint").isEqualTo( + AzureEnvironment.AZURE_CHINA.getActiveDirectoryEndpoint()); + }); } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java index bb4a3c42a8b5..9a03ef49d613 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java @@ -2,14 +2,11 @@ // Licensed under the MIT License. package com.azure.spring.cloud.autoconfigure.context; -import com.azure.core.management.AzureEnvironment; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import java.time.Duration; - import static org.assertj.core.api.Assertions.assertThat; class AzureGlobalPropertiesAutoConfigurationTest { @@ -25,38 +22,4 @@ void testAutoConfiguration() { }); } - @Test - void testAzureProperties() { - this.contextRunner.withPropertyValues( - "spring.cloud.azure.client.application-id=fake-application-id", - "spring.cloud.azure.credential.client-id=fake-client-id", - "spring.cloud.azure.credential.client-secret=fake-client-secret", - "spring.cloud.azure.credential.username=fake-username", - "spring.cloud.azure.credential.password=fake-password", - "spring.cloud.azure.proxy.hostname=proxy-host", - "spring.cloud.azure.proxy.port=8888", - "spring.cloud.azure.retry.timeout=200s", - "spring.cloud.azure.retry.backoff.delay=20s", - "spring.cloud.azure.profile.tenant-id=fake-tenant-id", - "spring.cloud.azure.profile.subscription-id=fake-sub-id", - "spring.cloud.azure.profile.cloud=azure_china" - ) - .run(context -> { - final AzureGlobalProperties azureProperties = context.getBean(AzureGlobalProperties.class); - assertThat(azureProperties).extracting("client.applicationId").isEqualTo("fake-application-id"); - assertThat(azureProperties).extracting("credential.clientId").isEqualTo("fake-client-id"); - assertThat(azureProperties).extracting("credential.clientSecret").isEqualTo("fake-client-secret"); - assertThat(azureProperties).extracting("credential.username").isEqualTo("fake-username"); - assertThat(azureProperties).extracting("credential.password").isEqualTo("fake-password"); - assertThat(azureProperties).extracting("proxy.hostname").isEqualTo("proxy-host"); - assertThat(azureProperties).extracting("proxy.port").isEqualTo(8888); - assertThat(azureProperties).extracting("retry.timeout").isEqualTo(Duration.ofSeconds(200)); - assertThat(azureProperties).extracting("retry.backoff.delay").isEqualTo(Duration.ofSeconds(20)); - assertThat(azureProperties).extracting("profile.tenantId").isEqualTo("fake-tenant-id"); - assertThat(azureProperties).extracting("profile.subscriptionId").isEqualTo("fake-sub-id"); - assertThat(azureProperties).extracting("profile.cloud").isEqualTo("azure_china"); - assertThat(azureProperties).extracting("profile.environment.activeDirectoryEndpoint").isEqualTo( - AzureEnvironment.AZURE_CHINA.getActiveDirectoryEndpoint()); - }); - } } From e1535b613b18344789936918ab9882d2f8d211dd Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Tue, 9 Nov 2021 20:53:19 +0800 Subject: [PATCH 04/15] fix extra convertion to String from Duration --- ...balConfigurationEnvironmentPostProcessor.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java index 40149754ae14..340adf812028 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessor.java @@ -94,22 +94,22 @@ enum AzureCoreEnvMapping { private static Log logger; private final String coreEnvName; private final String springPropertyName; - private final Function converter; + private final Function converter; AzureCoreEnvMapping(String coreEnvName, String springPropertyName) { - this(coreEnvName, springPropertyName, Function.identity()); + this(coreEnvName, springPropertyName, a -> a); } - AzureCoreEnvMapping(String coreEnvName, String springPropertyName, Function converter) { + AzureCoreEnvMapping(String coreEnvName, String springPropertyName, Function converter) { this.coreEnvName = coreEnvName; this.springPropertyName = "spring.cloud.azure." + springPropertyName; this.converter = converter; } - private static Function convertMillisToDuration() { + private static Function convertMillisToDuration() { return ms -> { try { - return Duration.ofMillis(Integer.parseInt(ms)).toString(); + return Duration.ofMillis(Integer.parseInt(ms)); } catch (Exception ignore) { if (logger != null) { logger.debug("The millisecond value " + ms + " is malformed."); @@ -132,13 +132,13 @@ enum AzureSdkEnvMapping { private final String sdkEnvName; private final String springPropertyName; - private final Function converter; + private final Function converter; AzureSdkEnvMapping(String sdkEnvName, String springPropertyName) { - this(sdkEnvName, springPropertyName, Function.identity()); + this(sdkEnvName, springPropertyName, a -> a); } - AzureSdkEnvMapping(String sdkEnvName, String springPropertyName, Function converter) { + AzureSdkEnvMapping(String sdkEnvName, String springPropertyName, Function converter) { this.sdkEnvName = sdkEnvName; this.springPropertyName = "spring.cloud.azure." + springPropertyName; this.converter = converter; From 266945fafe958f7882dde80509a93d78b486f53f Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Tue, 9 Nov 2021 21:26:43 +0800 Subject: [PATCH 05/15] refactor GlobalClientCP --- .../autoconfigure/properties/AzureGlobalProperties.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java index d9d3415c8fa5..a7ec4627c32a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java @@ -24,7 +24,7 @@ public class AzureGlobalProperties implements AzureProperties { public static final String PREFIX = "spring.cloud.azure"; @NestedConfigurationProperty - protected final GlobalClient client = new GlobalClient(); + protected final GlobalClientCP client = new GlobalClientCP(); @NestedConfigurationProperty protected final GlobalProxyCP proxy = new GlobalProxyCP(); @@ -39,7 +39,7 @@ public class AzureGlobalProperties implements AzureProperties { protected final AzureProfileCP profile = new AzureProfileCP(); @Override - public GlobalClient getClient() { + public GlobalClientCP getClient() { return client; } @@ -66,7 +66,7 @@ public AzureProfileCP getProfile() { /** * Global configurations for the transport client underneath. */ - public static final class GlobalClient extends ClientCP { + public static final class GlobalClientCP extends ClientCP { private final HttpClientCP http = new HttpClientCP(); private final AmqpClientCP amqp = new AmqpClientCP(); From 4f9bee44fe8340ef844960e7dbec1433b07c4905 Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Tue, 9 Nov 2021 23:45:15 +0800 Subject: [PATCH 06/15] fix profile.environment bug --- .../checkstyle/checkstyle-suppressions.xml | 2 + .../properties/AzureGlobalProperties.java | 12 +- .../core/profile/AzureProfileCP.java | 39 ++++-- ...AzureResourceManagerAutoConfiguration.java | 5 +- ...igurationEnvironmentPostProcessorTest.java | 56 +------- ...GlobalPropertiesAutoConfigurationTest.java | 43 ++++++ ...bResourceManagerAutoConfigurationTest.java | 9 +- ...eResourceManagerAutoConfigurationTest.java | 37 +++-- ...sResourceManagerAutoConfigurationTest.java | 9 +- ...eResourceManagerAutoConfigurationTest.java | 11 +- .../TestAzureResourceManager.java | 15 -- .../spring/core/aware/AzureProfileAware.java | 14 +- .../properties/profile/AzureEnvironment.java | 28 +--- .../core/properties/profile/AzureProfile.java | 27 +++- .../profile/KnownAzureEnvironment.java | 130 ++++++++++++++++++ .../properties/AzurePropertiesUtilsTest.java | 36 +++-- 16 files changed, 319 insertions(+), 154 deletions(-) delete mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/TestAzureResourceManager.java create mode 100644 sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/KnownAzureEnvironment.java diff --git a/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml b/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml index 508a46c33ee9..eba1a7377365 100755 --- a/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml +++ b/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml @@ -472,6 +472,8 @@ the main ServiceBusClientBuilder. --> + + diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java index a7ec4627c32a..02ce43972540 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java @@ -11,6 +11,7 @@ import com.azure.spring.cloud.autoconfigure.properties.core.retry.RetryCP; import com.azure.spring.core.properties.AzureProperties; import com.azure.spring.core.properties.client.LoggingProperties; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; import java.time.Duration; @@ -19,24 +20,25 @@ /** * */ +@ConfigurationProperties(prefix = AzureGlobalProperties.PREFIX) public class AzureGlobalProperties implements AzureProperties { public static final String PREFIX = "spring.cloud.azure"; @NestedConfigurationProperty - protected final GlobalClientCP client = new GlobalClientCP(); + private final GlobalClientCP client = new GlobalClientCP(); @NestedConfigurationProperty - protected final GlobalProxyCP proxy = new GlobalProxyCP(); + private final GlobalProxyCP proxy = new GlobalProxyCP(); @NestedConfigurationProperty - protected final GlobalRetryCP retry = new GlobalRetryCP(); + private final GlobalRetryCP retry = new GlobalRetryCP(); @NestedConfigurationProperty - protected final TokenCredentialCP credential = new TokenCredentialCP(); + private final TokenCredentialCP credential = new TokenCredentialCP(); @NestedConfigurationProperty - protected final AzureProfileCP profile = new AzureProfileCP(); + private final AzureProfileCP profile = new AzureProfileCP(); @Override public GlobalClientCP getClient() { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java index 9f228f3f5e8e..abb1d6700182 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java @@ -5,6 +5,7 @@ import com.azure.spring.core.aware.AzureProfileAware; import com.azure.spring.core.properties.profile.AzureEnvironment; +import com.azure.spring.core.properties.profile.KnownAzureEnvironment; import org.springframework.boot.context.properties.NestedConfigurationProperty; /** @@ -14,9 +15,11 @@ public class AzureProfileCP implements AzureProfileAware.Profile { private String tenantId; private String subscriptionId; - private String cloud = "Azure"; // TODO (xiada) this name + private AzureProfileAware.CloudType cloud = AzureProfileAware.CloudType.AZURE; @NestedConfigurationProperty - private AzureEnvironment environment = AzureEnvironment.AZURE; + private AzureEnvironment environment = KnownAzureEnvironment.AZURE_ENV; + private final AzureEnvironment otherAzureEnvironment = + new AzureEnvironment(com.azure.core.management.AzureEnvironment.AZURE); public String getTenantId() { return tenantId; @@ -30,21 +33,37 @@ public String getSubscriptionId() { return subscriptionId; } - public void setSubscriptionId(String subscriptionId) { - this.subscriptionId = subscriptionId; - } - - public String getCloud() { + @Override + public AzureProfileAware.CloudType getCloud() { return cloud; } - public void setCloud(String cloud) { + public void setCloud(AzureProfileAware.CloudType cloud) { this.cloud = cloud; - this.environment = AzureEnvironment.fromAzureCloud(cloud); + this.environment = decideAzureEnvironment(); + } + + public void setSubscriptionId(String subscriptionId) { + this.subscriptionId = subscriptionId; } public AzureEnvironment getEnvironment() { - return environment; + return this.environment; + } + + private AzureEnvironment decideAzureEnvironment() { + switch (cloud) { + case AZURE_CHINA: + return KnownAzureEnvironment.AZURE_CHINA_ENV; + case AZURE_US_GOVERNMENT: + return KnownAzureEnvironment.AZURE_US_GOVERNMENT_ENV; + case AZURE_GERMANY: + return KnownAzureEnvironment.AZURE_GERMANY_ENV; + case AZURE: + return KnownAzureEnvironment.AZURE_ENV; + default: + return otherAzureEnvironment; + } } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureResourceManagerAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureResourceManagerAutoConfiguration.java index cc684d18667c..2003b032213b 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureResourceManagerAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureResourceManagerAutoConfiguration.java @@ -4,7 +4,6 @@ package com.azure.spring.cloud.autoconfigure.resourcemanager; import com.azure.core.credential.TokenCredential; -import com.azure.core.management.AzureEnvironment; import com.azure.core.management.profile.AzureProfile; import com.azure.resourcemanager.AzureResourceManager; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; @@ -44,9 +43,7 @@ public AzureResourceManager azureResourceManager(TokenCredential tokenCredential public AzureProfile azureProfile() { return new AzureProfile(this.globalProperties.getProfile().getTenantId(), this.globalProperties.getProfile().getSubscriptionId(), - new AzureEnvironment(this.globalProperties.getProfile() - .getEnvironment() - .exportEndpointsMap())); + this.globalProperties.getProfile().getEnvironment().toManagementAzureEnvironment()); } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java index e69c53c9c3ae..47fbec7331b5 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalConfigurationEnvironmentPostProcessorTest.java @@ -4,18 +4,14 @@ package com.azure.spring.cloud.autoconfigure.context; import com.azure.core.http.policy.HttpLogDetailLevel; -import com.azure.core.management.AzureEnvironment; import com.azure.spring.cloud.autoconfigure.eventhubs.properties.AzureEventHubProperties; import com.azure.spring.cloud.autoconfigure.keyvault.secrets.properties.AzureKeyVaultSecretProperties; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; +import com.azure.spring.core.aware.AzureProfileAware; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.parallel.Execution; -import org.junit.jupiter.api.parallel.ExecutionMode; -import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.boot.logging.DeferredLog; -import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.PropertiesPropertySource; import org.springframework.web.context.support.StandardServletEnvironment; @@ -39,10 +35,8 @@ import static com.azure.core.util.Configuration.PROPERTY_AZURE_TENANT_ID; import static com.azure.core.util.Configuration.PROPERTY_AZURE_USERNAME; import static com.azure.core.util.Configuration.PROPERTY_NO_PROXY; -import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; -@Execution(ExecutionMode.SAME_THREAD) class AzureGlobalConfigurationEnvironmentPostProcessorTest { @Test @@ -112,7 +106,7 @@ void azureCoreEnvShouldBindCorrect() { properties.put(PROPERTY_AZURE_PASSWORD, "core-password"); properties.put(PROPERTY_AZURE_TENANT_ID, "core-tenant-id"); properties.put(PROPERTY_AZURE_SUBSCRIPTION_ID, "core-sub-id"); - properties.put(PROPERTY_AZURE_CLOUD, "azure_china"); + properties.put(PROPERTY_AZURE_CLOUD, "other"); properties.put(PROPERTY_AZURE_AUTHORITY_HOST, "aad"); properties.put(PROPERTY_AZURE_REQUEST_RETRY_COUNT, 3); properties.put(PROPERTY_AZURE_HTTP_LOG_DETAIL_LEVEL, "headers"); @@ -134,7 +128,7 @@ void azureCoreEnvShouldBindCorrect() { assertEquals("core-password", globalProperties.getCredential().getPassword()); assertEquals("core-tenant-id", globalProperties.getProfile().getTenantId()); assertEquals("core-sub-id", globalProperties.getProfile().getSubscriptionId()); - assertEquals("azure_china", globalProperties.getProfile().getCloud()); + assertEquals(AzureProfileAware.CloudType.OTHER, globalProperties.getProfile().getCloud()); assertEquals("aad", globalProperties.getProfile().getEnvironment().getActiveDirectoryEndpoint()); assertEquals(3, globalProperties.getRetry().getMaxAttempts()); assertEquals(HttpLogDetailLevel.HEADERS, globalProperties.getClient().getHttp().getLogging().getLevel()); @@ -192,48 +186,4 @@ private ConfigurableEnvironment getEnvironment(PropertiesPropertySource properti return environment; } - /** - * Move the testAzureProperties() to this test class for the JavaBeanBinder.Bean.cached will cache the binding - * result, when this test case was put in AzureGlobalPropertiesAutoConfigurationTest, and it ran concurrently with - * this class, which uses Binder, it would just fail occasionally. - */ - @Test - void testAzureProperties() { - final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(AzureGlobalPropertiesAutoConfiguration.class)); - - contextRunner - .withPropertyValues( - "spring.cloud.azure.client.application-id=fake-application-id", - "spring.cloud.azure.credential.client-id=fake-client-id", - "spring.cloud.azure.credential.client-secret=fake-client-secret", - "spring.cloud.azure.credential.username=fake-username", - "spring.cloud.azure.credential.password=fake-password", - "spring.cloud.azure.proxy.hostname=proxy-host", - "spring.cloud.azure.proxy.port=8888", - "spring.cloud.azure.retry.timeout=200s", - "spring.cloud.azure.retry.backoff.delay=20s", - "spring.cloud.azure.profile.tenant-id=fake-tenant-id", - "spring.cloud.azure.profile.subscription-id=fake-sub-id", - "spring.cloud.azure.profile.cloud=azure_china" - ) - .run(context -> { - final AzureGlobalProperties azureProperties = context.getBean(AzureGlobalProperties.class); - assertThat(azureProperties).extracting("client.applicationId").isEqualTo("fake-application-id"); - assertThat(azureProperties).extracting("credential.clientId").isEqualTo("fake-client-id"); - assertThat(azureProperties).extracting("credential.clientSecret").isEqualTo("fake-client-secret"); - assertThat(azureProperties).extracting("credential.username").isEqualTo("fake-username"); - assertThat(azureProperties).extracting("credential.password").isEqualTo("fake-password"); - assertThat(azureProperties).extracting("proxy.hostname").isEqualTo("proxy-host"); - assertThat(azureProperties).extracting("proxy.port").isEqualTo(8888); - assertThat(azureProperties).extracting("retry.timeout").isEqualTo(Duration.ofSeconds(200)); - assertThat(azureProperties).extracting("retry.backoff.delay").isEqualTo(Duration.ofSeconds(20)); - assertThat(azureProperties).extracting("profile.tenantId").isEqualTo("fake-tenant-id"); - assertThat(azureProperties).extracting("profile.subscriptionId").isEqualTo("fake-sub-id"); - assertThat(azureProperties).extracting("profile.cloud").isEqualTo("azure_china"); - assertThat(azureProperties).extracting("profile.environment.activeDirectoryEndpoint").isEqualTo( - AzureEnvironment.AZURE_CHINA.getActiveDirectoryEndpoint()); - }); - } - } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java index 9a03ef49d613..67418ed94c35 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java @@ -2,11 +2,15 @@ // Licensed under the MIT License. package com.azure.spring.cloud.autoconfigure.context; +import com.azure.core.management.AzureEnvironment; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import java.time.Duration; + +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_CHINA; import static org.assertj.core.api.Assertions.assertThat; class AzureGlobalPropertiesAutoConfigurationTest { @@ -22,4 +26,43 @@ void testAutoConfiguration() { }); } + @Test + void testAzureProperties() { + final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(AzureGlobalPropertiesAutoConfiguration.class)); + + contextRunner + .withPropertyValues( + "spring.cloud.azure.client.application-id=fake-application-id", + "spring.cloud.azure.credential.client-id=fake-client-id", + "spring.cloud.azure.credential.client-secret=fake-client-secret", + "spring.cloud.azure.credential.username=fake-username", + "spring.cloud.azure.credential.password=fake-password", + "spring.cloud.azure.proxy.hostname=proxy-host", + "spring.cloud.azure.proxy.port=8888", + "spring.cloud.azure.retry.timeout=200s", + "spring.cloud.azure.retry.backoff.delay=20s", + "spring.cloud.azure.profile.tenant-id=fake-tenant-id", + "spring.cloud.azure.profile.subscription-id=fake-sub-id", + "spring.cloud.azure.profile.cloud=azure_china" + ) + .run(context -> { + final AzureGlobalProperties azureProperties = context.getBean(AzureGlobalProperties.class); + assertThat(azureProperties).extracting("client.applicationId").isEqualTo("fake-application-id"); + assertThat(azureProperties).extracting("credential.clientId").isEqualTo("fake-client-id"); + assertThat(azureProperties).extracting("credential.clientSecret").isEqualTo("fake-client-secret"); + assertThat(azureProperties).extracting("credential.username").isEqualTo("fake-username"); + assertThat(azureProperties).extracting("credential.password").isEqualTo("fake-password"); + assertThat(azureProperties).extracting("proxy.hostname").isEqualTo("proxy-host"); + assertThat(azureProperties).extracting("proxy.port").isEqualTo(8888); + assertThat(azureProperties).extracting("retry.timeout").isEqualTo(Duration.ofSeconds(200)); + assertThat(azureProperties).extracting("retry.backoff.delay").isEqualTo(Duration.ofSeconds(20)); + assertThat(azureProperties).extracting("profile.tenantId").isEqualTo("fake-tenant-id"); + assertThat(azureProperties).extracting("profile.subscriptionId").isEqualTo("fake-sub-id"); + assertThat(azureProperties).extracting("profile.cloud").isEqualTo(AZURE_CHINA); + assertThat(azureProperties).extracting("profile.environment.activeDirectoryEndpoint").isEqualTo( + AzureEnvironment.AZURE_CHINA.getActiveDirectoryEndpoint()); + }); + } + } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureEventHubResourceManagerAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureEventHubResourceManagerAutoConfigurationTest.java index 7fbb1d947ff0..9c16fc3825ed 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureEventHubResourceManagerAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureEventHubResourceManagerAutoConfigurationTest.java @@ -5,8 +5,8 @@ import com.azure.messaging.eventhubs.EventHubClientBuilder; import com.azure.resourcemanager.AzureResourceManager; -import com.azure.spring.cloud.autoconfigure.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.eventhubs.properties.AzureEventHubProperties; +import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import com.azure.spring.cloud.resourcemanager.connectionstring.EventHubArmConnectionStringProvider; import com.azure.spring.eventhubs.provisioning.EventHubProvisioner; import org.junit.jupiter.api.Test; @@ -15,6 +15,7 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; class AzureEventHubResourceManagerAutoConfigurationTest { @@ -55,9 +56,9 @@ void testEventHubArmConnectionStringProviderBeanDisabled() { @Test void testAzureEventHubResourceManagerAutoConfigurationBeans() { this.contextRunner - .withUserConfiguration(AzureGlobalPropertiesAutoConfiguration.class, - AzureResourceManagerAutoConfiguration.class) - .withBean(AzureResourceManager.class, TestAzureResourceManager::getAzureResourceManager) + .withUserConfiguration(AzureResourceManagerAutoConfiguration.class) + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) + .withBean(AzureResourceManager.class, () -> mock(AzureResourceManager.class)) .withBean(AzureEventHubProperties.class, AzureEventHubProperties::new) .run(context -> assertThat(context).hasSingleBean(EventHubProvisioner.class)); } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureResourceManagerAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureResourceManagerAutoConfigurationTest.java index 91fc42aaa502..3aa4012badda 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureResourceManagerAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureResourceManagerAutoConfigurationTest.java @@ -6,8 +6,8 @@ import com.azure.core.management.profile.AzureProfile; import com.azure.resourcemanager.AzureResourceManager; import com.azure.spring.cloud.autoconfigure.context.AzureGlobalPropertiesAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import com.azure.spring.core.properties.resource.AzureResourceMetadata; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.FilteredClassLoader; @@ -16,6 +16,8 @@ import static com.azure.core.management.AzureEnvironment.AZURE; import static com.azure.core.management.AzureEnvironment.AZURE_CHINA; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; class AzureResourceManagerAutoConfigurationTest { @@ -42,6 +44,21 @@ void configureWithoutTenantId() { }); } + @Test + void configureWithTenantIdAndSubId() { + this.contextRunner + .withPropertyValues( + "spring.cloud.azure.profile.tenant-id=test-tenant", + "spring.cloud.azure.profile.subscription-id=test-subscription-id" + ) + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) + .withBean(AzureResourceManager.class, () -> mock(AzureResourceManager.class)) + .run(context -> { + assertThat(context).hasSingleBean(AzureResourceManagerAutoConfiguration.class); + assertThat(context).hasSingleBean(AzureProfile.class); + }); + } + @Test void configureWithTenantId() { this.contextRunner @@ -68,16 +85,18 @@ void testWithoutAzureResourceMetadataClass() { void testAzureProfileWithAzureDefault() { this.contextRunner .withUserConfiguration(AzureGlobalPropertiesAutoConfiguration.class) - .withBean(AzureResourceManager.class, TestAzureResourceManager::getAzureResourceManager) + .withBean(AzureResourceManager.class, () -> mock(AzureResourceManager.class)) .withPropertyValues( "spring.cloud.azure.profile.tenant-id=test-tenant-id", "spring.cloud.azure.profile.subscription-id=test-subscription-id" ) .run(context -> { assertThat(context).hasSingleBean(AzureProfile.class); + AzureProfile azureProfile = context.getBean(AzureProfile.class); - Assertions.assertEquals(azureProfile.getEnvironment().getActiveDirectoryEndpoint(), - AZURE.getActiveDirectoryEndpoint()); + assertEquals("test-subscription-id", azureProfile.getSubscriptionId()); + assertEquals("test-tenant-id", azureProfile.getTenantId()); + assertEquals(AZURE.getActiveDirectoryEndpoint(), azureProfile.getEnvironment().getActiveDirectoryEndpoint()); }); } @@ -85,17 +104,19 @@ void testAzureProfileWithAzureDefault() { void testAzureProfileWithAzureChina() { this.contextRunner .withUserConfiguration(AzureGlobalPropertiesAutoConfiguration.class) - .withBean(AzureResourceManager.class, TestAzureResourceManager::getAzureResourceManager) + .withBean(AzureResourceManager.class, () -> mock(AzureResourceManager.class)) .withPropertyValues( "spring.cloud.azure.profile.tenant-id=test-tenant-id", "spring.cloud.azure.profile.subscription-id=test-subscription-id", - "spring.cloud.azure.profile.cloud=AZURE_CHINA" + "spring.cloud.azure.profile.cloud=azure_china" ) .run(context -> { assertThat(context).hasSingleBean(AzureProfile.class); + AzureProfile azureProfile = context.getBean(AzureProfile.class); - Assertions.assertEquals(azureProfile.getEnvironment().getActiveDirectoryEndpoint(), - AZURE_CHINA.getActiveDirectoryEndpoint()); + assertEquals("test-subscription-id", azureProfile.getSubscriptionId()); + assertEquals("test-tenant-id", azureProfile.getTenantId()); + assertEquals(AZURE_CHINA.getActiveDirectoryEndpoint(), azureProfile.getEnvironment().getActiveDirectoryEndpoint()); }); } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureServiceBusResourceManagerAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureServiceBusResourceManagerAutoConfigurationTest.java index 459e280808bd..62d3f15768f8 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureServiceBusResourceManagerAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureServiceBusResourceManagerAutoConfigurationTest.java @@ -5,7 +5,7 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder; import com.azure.resourcemanager.AzureResourceManager; -import com.azure.spring.cloud.autoconfigure.context.AzureGlobalPropertiesAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.servicebus.properties.AzureServiceBusProperties; import com.azure.spring.cloud.resourcemanager.connectionstring.ServiceBusArmConnectionStringProvider; import com.azure.spring.servicebus.provisioning.ServiceBusQueueProvisioner; @@ -16,6 +16,7 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; class AzureServiceBusResourceManagerAutoConfigurationTest { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() @@ -54,9 +55,9 @@ void testServiceBusArmConnectionStringProviderBeanDisabled() { @Test void testAzureServiceBusResourceManagerAutoConfigurationBeans() { this.contextRunner - .withUserConfiguration(AzureGlobalPropertiesAutoConfiguration.class, - AzureResourceManagerAutoConfiguration.class) - .withBean(AzureResourceManager.class, TestAzureResourceManager::getAzureResourceManager) + .withUserConfiguration(AzureResourceManagerAutoConfiguration.class) + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) + .withBean(AzureResourceManager.class, () -> mock(AzureResourceManager.class)) .withBean(AzureServiceBusProperties.class, AzureServiceBusProperties::new) .run(context -> { assertThat(context).hasSingleBean(ServiceBusTopicProvisioner.class); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureStorageQueueResourceManagerAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureStorageQueueResourceManagerAutoConfigurationTest.java index f037c3135cc5..512376d37eaa 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureStorageQueueResourceManagerAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/AzureStorageQueueResourceManagerAutoConfigurationTest.java @@ -4,14 +4,15 @@ package com.azure.spring.cloud.autoconfigure.resourcemanager; import com.azure.resourcemanager.AzureResourceManager; -import com.azure.spring.cloud.autoconfigure.context.AzureGlobalPropertiesAutoConfiguration; -import com.azure.spring.cloud.autoconfigure.storage.queue.AzureStorageQueueProperties; +import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; +import com.azure.spring.cloud.autoconfigure.storage.queue.properties.AzureStorageQueueProperties; import com.azure.spring.cloud.resourcemanager.connectionstring.StorageQueueArmConnectionStringProvider; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; public class AzureStorageQueueResourceManagerAutoConfigurationTest { @@ -28,10 +29,10 @@ void testStorageQueueResourceManagerDisabled() { @Test void testAzureServiceBusResourceManagerAutoConfigurationBeans() { this.contextRunner - .withUserConfiguration(AzureGlobalPropertiesAutoConfiguration.class, - AzureResourceManagerAutoConfiguration.class) - .withBean(AzureResourceManager.class, TestAzureResourceManager::getAzureResourceManager) + .withUserConfiguration(AzureResourceManagerAutoConfiguration.class) + .withBean(AzureResourceManager.class, () -> mock(AzureResourceManager.class)) .withBean(AzureStorageQueueProperties.class, AzureStorageQueueProperties::new) + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) .withPropertyValues(AzureStorageQueueProperties.PREFIX + ".account-name=test-account") .run(context -> assertThat(context).hasSingleBean(StorageQueueArmConnectionStringProvider.class)); } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/TestAzureResourceManager.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/TestAzureResourceManager.java deleted file mode 100644 index 2d15ee7542e5..000000000000 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/resourcemanager/TestAzureResourceManager.java +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.cloud.autoconfigure.resourcemanager; - -import com.azure.resourcemanager.AzureResourceManager; - -import static org.mockito.Mockito.mock; - - -class TestAzureResourceManager { - static AzureResourceManager getAzureResourceManager() { - return mock(AzureResourceManager.class); - } -} diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java index 68dc524df463..a1f0207f52c4 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java @@ -19,12 +19,24 @@ interface Profile { String getSubscriptionId(); - String getCloud(); + CloudType getCloud(); Environment getEnvironment(); } + /** + * Define the cloud environment type, with four known Azure cloud type and the types don't fall in the four known + * types will be OTHER. + */ + enum CloudType { + AZURE, + AZURE_CHINA, + AZURE_GERMANY, + AZURE_US_GOVERNMENT, + OTHER + } + /** * Interface to be implemented by classes that wish to describe an Azure cloud environment. */ diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureEnvironment.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureEnvironment.java index 0cff55b7a421..ceace0fc565d 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureEnvironment.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureEnvironment.java @@ -6,10 +6,8 @@ import com.azure.spring.core.aware.AzureProfileAware; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.util.StringUtils; import java.util.HashMap; -import java.util.Locale; import java.util.Map; /** @@ -19,11 +17,6 @@ public class AzureEnvironment implements AzureProfileAware.Environment { private static final Logger LOGGER = LoggerFactory.getLogger(AzureEnvironment.class); - public static final AzureEnvironment AZURE_CHINA = new AzureEnvironment(com.azure.core.management.AzureEnvironment.AZURE_CHINA); - public static final AzureEnvironment AZURE = new AzureEnvironment(com.azure.core.management.AzureEnvironment.AZURE); - public static final AzureEnvironment AZURE_GERMANY = new AzureEnvironment(com.azure.core.management.AzureEnvironment.AZURE_GERMANY); - public static final AzureEnvironment AZURE_US_GOVERNMENT = new AzureEnvironment(com.azure.core.management.AzureEnvironment.AZURE_US_GOVERNMENT); - private String portal; private String publishingProfile; private String managementEndpoint; @@ -70,25 +63,11 @@ public AzureEnvironment(com.azure.core.management.AzureEnvironment azureEnvironm this.azureApplicationInsightsEndpoint = azureEnvironment.getApplicationInsightsEndpoint(); } - public static AzureEnvironment fromAzureCloud(String cloud) { - if (!StringUtils.hasText(cloud)) { - LOGGER.warn("Cloud is empty, return the default AzureEnvironment"); - return AZURE; - } - - switch (cloud.toUpperCase(Locale.ROOT)) { - case "AZURE_CHINA": - return AZURE_CHINA; - case "AZURE_US_GOVERNMENT": - return AZURE_US_GOVERNMENT; - case "AZURE_GERMANY": - return AZURE_GERMANY; - default: - return AZURE; - } + public com.azure.core.management.AzureEnvironment toManagementAzureEnvironment() { + return new com.azure.core.management.AzureEnvironment(exportEndpointsMap()); } - public Map exportEndpointsMap() { + private Map exportEndpointsMap() { return new HashMap() { { put("portalUrl", portal); @@ -265,4 +244,5 @@ public String getAzureApplicationInsightsEndpoint() { public void setAzureApplicationInsightsEndpoint(String azureApplicationInsightsEndpoint) { this.azureApplicationInsightsEndpoint = azureApplicationInsightsEndpoint; } + } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfile.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfile.java index a996705094b9..31972775e6c9 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfile.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfile.java @@ -12,8 +12,8 @@ public class AzureProfile implements AzureProfileAware.Profile { private String tenantId; private String subscriptionId; - private String cloud = "Azure"; // TODO (xiada) this name - private AzureEnvironment environment = AzureEnvironment.AZURE; + private AzureProfileAware.CloudType cloud = AzureProfileAware.CloudType.AZURE; + private final AzureEnvironment otherEnvironment = new AzureEnvironment(com.azure.core.management.AzureEnvironment.AZURE); public String getTenantId() { return tenantId; @@ -31,17 +31,32 @@ public void setSubscriptionId(String subscriptionId) { this.subscriptionId = subscriptionId; } - public String getCloud() { + @Override + public AzureProfileAware.CloudType getCloud() { return cloud; } - public void setCloud(String cloud) { + public void setCloud(AzureProfileAware.CloudType cloud) { this.cloud = cloud; - this.environment = AzureEnvironment.fromAzureCloud(cloud); } public AzureEnvironment getEnvironment() { - return environment; + switch (cloud) { + case AZURE_CHINA: + return KnownAzureEnvironment.AZURE_CHINA_ENV; + case AZURE_US_GOVERNMENT: + return KnownAzureEnvironment.AZURE_US_GOVERNMENT_ENV; + case AZURE_GERMANY: + return KnownAzureEnvironment.AZURE_GERMANY_ENV; + case AZURE: + return KnownAzureEnvironment.AZURE_ENV; + default: + return otherEnvironment; + } } + + + + } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/KnownAzureEnvironment.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/KnownAzureEnvironment.java new file mode 100644 index 000000000000..5612e395a431 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/KnownAzureEnvironment.java @@ -0,0 +1,130 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.properties.profile; + +import com.azure.spring.core.aware.AzureProfileAware; +import org.springframework.util.Assert; + +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_CHINA; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_GERMANY; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_US_GOVERNMENT; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.OTHER; + +/** + * The AzureEnvironment defines all properties to Azure services, such as endpoints, resource ids, etc. + */ +public class KnownAzureEnvironment extends AzureEnvironment { + + public static final KnownAzureEnvironment AZURE_CHINA_ENV = new KnownAzureEnvironment(AZURE_CHINA); + public static final KnownAzureEnvironment AZURE_ENV = new KnownAzureEnvironment(AZURE); + public static final KnownAzureEnvironment AZURE_GERMANY_ENV = new KnownAzureEnvironment(AZURE_GERMANY); + public static final KnownAzureEnvironment AZURE_US_GOVERNMENT_ENV = new KnownAzureEnvironment(AZURE_US_GOVERNMENT); + private final AzureProfileAware.CloudType type; + + + public KnownAzureEnvironment(AzureProfileAware.CloudType cloudType) { + super(convertToManagementAzureEnvironmentByType(cloudType)); + this.type = cloudType; + } + + private static com.azure.core.management.AzureEnvironment convertToManagementAzureEnvironmentByType( + AzureProfileAware.CloudType cloud) { + Assert.isTrue(cloud != OTHER, "cloud type should not be other for PredefinedAzureEnvironment"); + switch (cloud) { + case AZURE_CHINA: + return com.azure.core.management.AzureEnvironment.AZURE_CHINA; + case AZURE_US_GOVERNMENT: + return com.azure.core.management.AzureEnvironment.AZURE_US_GOVERNMENT; + case AZURE_GERMANY: + return com.azure.core.management.AzureEnvironment.AZURE_GERMANY; + default: + return com.azure.core.management.AzureEnvironment.AZURE; + } + } + + @Override + public com.azure.core.management.AzureEnvironment toManagementAzureEnvironment() { + return convertToManagementAzureEnvironmentByType(this.type); + } + + public void setPortal(String portal) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setPublishingProfile(String publishingProfile) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setManagementEndpoint(String managementEndpoint) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setResourceManagerEndpoint(String resourceManagerEndpoint) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setSqlManagementEndpoint(String sqlManagementEndpoint) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setSqlServerHostnameSuffix(String sqlServerHostnameSuffix) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setGalleryEndpoint(String galleryEndpoint) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setActiveDirectoryEndpoint(String activeDirectoryEndpoint) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setActiveDirectoryResourceId(String activeDirectoryResourceId) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setActiveDirectoryGraphEndpoint(String activeDirectoryGraphEndpoint) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setMicrosoftGraphEndpoint(String microsoftGraphEndpoint) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setDataLakeEndpointResourceId(String dataLakeEndpointResourceId) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setActiveDirectoryGraphApiVersion(String activeDirectoryGraphApiVersion) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setStorageEndpointSuffix(String storageEndpointSuffix) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setKeyVaultDnsSuffix(String keyVaultDnsSuffix) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setAzureDataLakeStoreFileSystemEndpointSuffix(String azureDataLakeStoreFileSystemEndpointSuffix) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setAzureDataLakeAnalyticsCatalogAndJobEndpointSuffix(String azureDataLakeAnalyticsCatalogAndJobEndpointSuffix) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setAzureLogAnalyticsEndpoint(String azureLogAnalyticsEndpoint) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + public void setAzureApplicationInsightsEndpoint(String azureApplicationInsightsEndpoint) { + throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + } + + + +} diff --git a/sdk/spring/spring-cloud-azure-core/src/test/java/com/azure/spring/cloud/core/properties/AzurePropertiesUtilsTest.java b/sdk/spring/spring-cloud-azure-core/src/test/java/com/azure/spring/cloud/core/properties/AzurePropertiesUtilsTest.java index 7518a653bb19..cf4e4b6d2962 100644 --- a/sdk/spring/spring-cloud-azure-core/src/test/java/com/azure/spring/cloud/core/properties/AzurePropertiesUtilsTest.java +++ b/sdk/spring/spring-cloud-azure-core/src/test/java/com/azure/spring/cloud/core/properties/AzurePropertiesUtilsTest.java @@ -15,8 +15,12 @@ import java.time.Duration; -import static com.azure.spring.core.properties.profile.AzureEnvironment.AZURE; -import static com.azure.spring.core.properties.profile.AzureEnvironment.AZURE_CHINA; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_CHINA; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.OTHER; +import static com.azure.spring.core.properties.profile.KnownAzureEnvironment.AZURE_CHINA_ENV; +import static com.azure.spring.core.properties.profile.KnownAzureEnvironment.AZURE_ENV; + /** * @@ -27,7 +31,7 @@ class AzurePropertiesUtilsTest { void testCopyPropertiesToNewObjectShouldEqual() { AzurePropertiesA source = new AzurePropertiesA(); source.client.setApplicationId("application-id-A"); - source.profile.setCloud("AZURE_CHINA"); + source.profile.setCloud(AZURE_CHINA); source.profile.setTenantId("tenant-id-A"); source.proxy.setHostname("hostname-A"); source.retry.getBackoff().setDelay(Duration.ofSeconds(2)); @@ -37,19 +41,19 @@ void testCopyPropertiesToNewObjectShouldEqual() { AzurePropertiesUtils.copyAzureCommonProperties(source, target); Assertions.assertEquals("application-id-A", target.client.getApplicationId()); - Assertions.assertEquals("AZURE_CHINA", target.profile.getCloud()); + Assertions.assertEquals(AZURE_CHINA, target.profile.getCloud()); Assertions.assertEquals("tenant-id-A", target.profile.getTenantId()); Assertions.assertEquals("hostname-A", target.proxy.getHostname()); Assertions.assertEquals(Duration.ofSeconds(2), target.retry.getBackoff().getDelay()); Assertions.assertEquals("client-id-A", target.credential.getClientId()); - Assertions.assertEquals(AZURE_CHINA.getActiveDirectoryEndpoint(), target.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AZURE_CHINA_ENV.getActiveDirectoryEndpoint(), target.profile.getEnvironment().getActiveDirectoryEndpoint()); } @Test void testCopyPropertiesToObjectWithSameFieldsSetShouldOverride() { AzurePropertiesA source = new AzurePropertiesA(); source.client.setApplicationId("application-id-A"); - source.profile.setCloud("AZURE_CHINA"); + source.profile.setCloud(AZURE_CHINA); source.profile.setTenantId("tenant-id-A"); source.proxy.setHostname("hostname-A"); source.retry.getBackoff().setDelay(Duration.ofSeconds(2)); @@ -57,29 +61,29 @@ void testCopyPropertiesToObjectWithSameFieldsSetShouldOverride() { AzurePropertiesB target = new AzurePropertiesB(); target.client.setApplicationId("application-id-B"); - target.profile.setCloud("AZURE"); + target.profile.setCloud(AZURE); target.profile.setTenantId("tenant-id-B"); target.proxy.setHostname("hostname-B"); target.retry.getBackoff().setDelay(Duration.ofSeconds(4)); target.credential.setClientId("client-id-B"); Assertions.assertEquals("application-id-B", target.client.getApplicationId()); - Assertions.assertEquals("AZURE", target.profile.getCloud()); + Assertions.assertEquals(AZURE, target.profile.getCloud()); Assertions.assertEquals("tenant-id-B", target.profile.getTenantId()); Assertions.assertEquals("hostname-B", target.proxy.getHostname()); Assertions.assertEquals(Duration.ofSeconds(4), target.retry.getBackoff().getDelay()); Assertions.assertEquals("client-id-B", target.credential.getClientId()); - Assertions.assertEquals(AZURE.getActiveDirectoryEndpoint(), target.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AZURE_ENV.getActiveDirectoryEndpoint(), target.profile.getEnvironment().getActiveDirectoryEndpoint()); AzurePropertiesUtils.copyAzureCommonProperties(source, target); Assertions.assertEquals("application-id-A", target.client.getApplicationId()); - Assertions.assertEquals("AZURE_CHINA", target.profile.getCloud()); + Assertions.assertEquals(AZURE_CHINA, target.profile.getCloud()); Assertions.assertEquals("tenant-id-A", target.profile.getTenantId()); Assertions.assertEquals("hostname-A", target.proxy.getHostname()); Assertions.assertEquals(Duration.ofSeconds(2), target.retry.getBackoff().getDelay()); Assertions.assertEquals("client-id-A", target.credential.getClientId()); - Assertions.assertEquals(AZURE_CHINA.getActiveDirectoryEndpoint(), target.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AZURE_CHINA_ENV.getActiveDirectoryEndpoint(), target.profile.getEnvironment().getActiveDirectoryEndpoint()); } @@ -107,9 +111,10 @@ void testCopyPropertiesIgnoreNullToObjectWithDifferentFieldsSetShouldMerge() { AzurePropertiesB target = new AzurePropertiesB(); target.credential.setClientSecret("client-secret-B"); target.retry.getBackoff().setMaxDelay(Duration.ofSeconds(2)); + target.profile.setCloud(OTHER); target.profile.getEnvironment().setActiveDirectoryEndpoint("abc"); - Assertions.assertEquals(AZURE.getActiveDirectoryEndpoint(), source.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AZURE_ENV.getActiveDirectoryEndpoint(), source.profile.getEnvironment().getActiveDirectoryEndpoint()); Assertions.assertEquals("client-secret-B", target.credential.getClientSecret()); Assertions.assertEquals(Duration.ofSeconds(2), target.retry.getBackoff().getMaxDelay()); @@ -119,12 +124,12 @@ void testCopyPropertiesIgnoreNullToObjectWithDifferentFieldsSetShouldMerge() { Assertions.assertEquals("client-id-A", target.credential.getClientId()); Assertions.assertEquals("client-secret-B", target.credential.getClientSecret()); Assertions.assertEquals(Duration.ofSeconds(2), target.retry.getBackoff().getMaxDelay()); - Assertions.assertEquals("abc", target.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AZURE_ENV.getActiveDirectoryEndpoint(), target.profile.getEnvironment().getActiveDirectoryEndpoint()); // source properties should not be updated Assertions.assertNull(source.credential.getClientSecret()); - Assertions.assertEquals(AZURE.getActiveDirectoryEndpoint(), source.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AZURE_ENV.getActiveDirectoryEndpoint(), source.profile.getEnvironment().getActiveDirectoryEndpoint()); } @Test @@ -140,10 +145,11 @@ void testCopyPropertiesSourceNotChanged() { // Update target will not affect source target.retry.getBackoff().setDelay(Duration.ofSeconds(2)); + target.profile.setCloud(OTHER); target.profile.getEnvironment().setActiveDirectoryEndpoint("abc"); Assertions.assertNull(source.retry.getBackoff().getDelay()); - Assertions.assertEquals(AZURE.getActiveDirectoryEndpoint(), source.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AZURE_ENV.getActiveDirectoryEndpoint(), source.profile.getEnvironment().getActiveDirectoryEndpoint()); } From 46841445a603bab9fd16cc48d3cbbbeccab906bb Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Wed, 10 Nov 2021 10:23:52 +0800 Subject: [PATCH 07/15] change exception thrown to logger warning --- .../profile/KnownAzureEnvironment.java | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/KnownAzureEnvironment.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/KnownAzureEnvironment.java index 5612e395a431..009aca9b2f82 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/KnownAzureEnvironment.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/KnownAzureEnvironment.java @@ -4,6 +4,8 @@ package com.azure.spring.core.properties.profile; import com.azure.spring.core.aware.AzureProfileAware; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.util.Assert; import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE; @@ -17,6 +19,8 @@ */ public class KnownAzureEnvironment extends AzureEnvironment { + private static final Logger LOGGER = LoggerFactory.getLogger(KnownAzureEnvironment.class); + public static final KnownAzureEnvironment AZURE_CHINA_ENV = new KnownAzureEnvironment(AZURE_CHINA); public static final KnownAzureEnvironment AZURE_ENV = new KnownAzureEnvironment(AZURE); public static final KnownAzureEnvironment AZURE_GERMANY_ENV = new KnownAzureEnvironment(AZURE_GERMANY); @@ -50,79 +54,79 @@ public com.azure.core.management.AzureEnvironment toManagementAzureEnvironment() } public void setPortal(String portal) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setPublishingProfile(String publishingProfile) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setManagementEndpoint(String managementEndpoint) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setResourceManagerEndpoint(String resourceManagerEndpoint) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setSqlManagementEndpoint(String sqlManagementEndpoint) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setSqlServerHostnameSuffix(String sqlServerHostnameSuffix) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setGalleryEndpoint(String galleryEndpoint) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setActiveDirectoryEndpoint(String activeDirectoryEndpoint) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setActiveDirectoryResourceId(String activeDirectoryResourceId) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setActiveDirectoryGraphEndpoint(String activeDirectoryGraphEndpoint) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setMicrosoftGraphEndpoint(String microsoftGraphEndpoint) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setDataLakeEndpointResourceId(String dataLakeEndpointResourceId) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setActiveDirectoryGraphApiVersion(String activeDirectoryGraphApiVersion) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setStorageEndpointSuffix(String storageEndpointSuffix) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setKeyVaultDnsSuffix(String keyVaultDnsSuffix) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setAzureDataLakeStoreFileSystemEndpointSuffix(String azureDataLakeStoreFileSystemEndpointSuffix) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setAzureDataLakeAnalyticsCatalogAndJobEndpointSuffix(String azureDataLakeAnalyticsCatalogAndJobEndpointSuffix) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setAzureLogAnalyticsEndpoint(String azureLogAnalyticsEndpoint) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } public void setAzureApplicationInsightsEndpoint(String azureApplicationInsightsEndpoint) { - throw new UnsupportedOperationException("Set method is not supported in a KnownAzureEnvironment"); + LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); } From c7d1f78bb5e147a1fb007e1c77ebcfae3ae1474e Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Wed, 10 Nov 2021 22:05:24 +0800 Subject: [PATCH 08/15] add java docs for configuration properties --- .../properties/AzureEventHubProperties.java | 9 ++ .../common/AzureKeyVaultProperties.java | 3 + .../properties/AzureGlobalProperties.java | 40 +++++++- .../core/AbstractAzureServiceCP.java | 3 + .../authentication/TokenCredentialCP.java | 95 ++++++++++++++++++- .../properties/core/client/ClientCP.java | 6 ++ .../properties/core/client/HttpClientCP.java | 8 +- .../properties/core/client/HttpLoggingCP.java | 58 +++++++++++ .../core/profile/AzureProfileCP.java | 11 +++ .../properties/core/proxy/HttpProxyCP.java | 17 +++- .../properties/core/proxy/ProxyCP.java | 82 +++++++++++++++- .../properties/core/retry/HttpRetryCP.java | 44 +-------- .../properties/core/retry/RetryCP.java | 43 ++++++++- ...GlobalPropertiesAutoConfigurationTest.java | 36 ++++++- .../azure/spring/core/aware/ClientAware.java | 16 ++++ .../azure/spring/core/aware/RetryAware.java | 8 ++ .../TokenCredentialProperties.java | 4 - .../client/HttpClientProperties.java | 4 +- ...erties.java => HttpLoggingProperties.java} | 14 ++- .../properties/profile/AzureEnvironment.java | 3 + .../properties/proxy/HttpProxyProperties.java | 3 + .../properties/retry/BackoffProperties.java | 5 +- 22 files changed, 440 insertions(+), 72 deletions(-) create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpLoggingCP.java rename sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/{LoggingProperties.java => HttpLoggingProperties.java} (78%) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/properties/AzureEventHubProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/properties/AzureEventHubProperties.java index dc5abfa940d1..8e4b658871f0 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/properties/AzureEventHubProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/properties/AzureEventHubProperties.java @@ -137,8 +137,17 @@ public static class Producer extends AzureEventHubCommonProperties implements Ev * Properties of an Event Hub consumer. */ public static class Consumer extends AzureEventHubCommonProperties implements EventHubConsumerDescriptor { + + /** + * Name of the consumer group this consumer is associated with. + */ protected String consumerGroup; + /** + * The number of events the Event Hub consumer will actively receive and queue locally without regard to + * whether a receiving operation is currently active. + * + */ protected Integer prefetchCount; public String getConsumerGroup() { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/common/AzureKeyVaultProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/common/AzureKeyVaultProperties.java index ed288f414732..fdd82d9832b8 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/common/AzureKeyVaultProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/common/AzureKeyVaultProperties.java @@ -10,6 +10,9 @@ */ public class AzureKeyVaultProperties extends AbstractAzureHttpCP { + /** + * Azure Key Vault endpoint. + */ private String endpoint; public String getEndpoint() { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java index 02ce43972540..ccbeef2f1c0f 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AzureGlobalProperties.java @@ -6,11 +6,11 @@ import com.azure.core.amqp.AmqpTransportType; import com.azure.spring.cloud.autoconfigure.properties.core.authentication.TokenCredentialCP; import com.azure.spring.cloud.autoconfigure.properties.core.client.ClientCP; +import com.azure.spring.cloud.autoconfigure.properties.core.client.HttpLoggingCP; import com.azure.spring.cloud.autoconfigure.properties.core.profile.AzureProfileCP; import com.azure.spring.cloud.autoconfigure.properties.core.proxy.ProxyCP; import com.azure.spring.cloud.autoconfigure.properties.core.retry.RetryCP; import com.azure.spring.core.properties.AzureProperties; -import com.azure.spring.core.properties.client.LoggingProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; @@ -111,7 +111,14 @@ public HttpRetryCP getHttp() { */ public static final class HttpRetryCP { + /** + * HTTP header, such as Retry-After or x-ms-retry-after-ms, to lookup for the retry delay. + * If the value is null, will calculate the delay using backoff and ignore the delay provided in response header. + */ private String retryAfterHeader; + /** + * Time unit to use when applying the retry delay. + */ private ChronoUnit retryAfterTimeUnit; public String getRetryAfterHeader() { @@ -136,6 +143,9 @@ public void setRetryAfterTimeUnit(ChronoUnit retryAfterTimeUnit) { */ public static final class HttpProxyCP { + /** + * A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through. + */ private String nonProxyHosts; public String getNonProxyHosts() { @@ -151,15 +161,33 @@ public void setNonProxyHosts(String nonProxyHosts) { * Transport properties for http-based clients. */ public static final class HttpClientCP { - + /** + * Amount of time each request being sent over the wire. + */ private Duration writeTimeout; + /** + * Amount of time used when waiting for a server to reply. + */ private Duration responseTimeout; + /** + * Amount of time used when reading the server response. + */ private Duration readTimeout; + /** + * Amount of time the request attempts to connect to the remote host and the connection is resolved. + */ private Duration connectTimeout; + /** + * Maximum connection pool size used by the underlying HTTP client. + */ private Integer maximumConnectionPoolSize; + /** + * Amount of time before an idle connection. + */ private Duration connectionIdleTimeout; + @NestedConfigurationProperty - private final LoggingProperties logging = new LoggingProperties(); + private final HttpLoggingCP logging = new HttpLoggingCP(); public Duration getWriteTimeout() { return writeTimeout; @@ -209,7 +237,7 @@ public void setConnectionIdleTimeout(Duration connectionIdleTimeout) { this.connectionIdleTimeout = connectionIdleTimeout; } - public LoggingProperties getLogging() { + public HttpLoggingCP getLogging() { return logging; } } @@ -218,6 +246,10 @@ public LoggingProperties getLogging() { * Transport properties for amqp-based clients. */ public static final class AmqpClientCP { + + /** + * Transport type for AMQP-based client. + */ private AmqpTransportType transportType = AmqpTransportType.AMQP; public AmqpTransportType getTransportType() { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/AbstractAzureServiceCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/AbstractAzureServiceCP.java index 693893c9a9cb..1367e573ee64 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/AbstractAzureServiceCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/AbstractAzureServiceCP.java @@ -14,6 +14,9 @@ */ public abstract class AbstractAzureServiceCP implements AzureProperties { + /** + * Whether an Azure Service is enabled. + */ protected boolean enabled = true; @NestedConfigurationProperty diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/authentication/TokenCredentialCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/authentication/TokenCredentialCP.java index f49767426680..04ee393a9746 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/authentication/TokenCredentialCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/authentication/TokenCredentialCP.java @@ -4,11 +4,102 @@ package com.azure.spring.cloud.autoconfigure.properties.core.authentication; -import com.azure.spring.core.properties.authentication.TokenCredentialProperties; +import com.azure.spring.core.aware.authentication.TokenCredentialAware; /** * Azure properties used for getting token credential. */ -public class TokenCredentialCP extends TokenCredentialProperties { +public class TokenCredentialCP implements TokenCredentialAware.TokenCredential { + + /** + * Client id to use when performing service principal authentication with Azure. + */ + private String clientId; + + /** + * Client secret to use when performing service principal authentication with Azure. + */ + private String clientSecret; + + /** + * Path of a PEM certificate file to use when performing service principal authentication with Azure. + */ + private String clientCertificatePath; + + /** + * Password of the certificate file. + */ + private String clientCertificatePassword; + + /** + * Username to use when performing username/password authentication with Azure. + */ + private String username; + + /** + * Password to use when performing username/password authentication with Azure. + */ + private String password; + + /** + * Client id to use when using managed identity to authenticate with Azure. + */ + private String managedIdentityClientId; + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getClientSecret() { + return clientSecret; + } + + public void setClientSecret(String clientSecret) { + this.clientSecret = clientSecret; + } + + public String getClientCertificatePath() { + return clientCertificatePath; + } + + public void setClientCertificatePath(String clientCertificatePath) { + this.clientCertificatePath = clientCertificatePath; + } + + public String getClientCertificatePassword() { + return clientCertificatePassword; + } + + public void setClientCertificatePassword(String clientCertificatePassword) { + this.clientCertificatePassword = clientCertificatePassword; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getManagedIdentityClientId() { + return managedIdentityClientId; + } + + public void setManagedIdentityClientId(String managedIdentityClientId) { + this.managedIdentityClientId = managedIdentityClientId; + } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/ClientCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/ClientCP.java index 013086b04033..221a60e08b4b 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/ClientCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/ClientCP.java @@ -14,7 +14,13 @@ */ public class ClientCP implements ClientAware.Client { + /** + * Represents current application and is used for telemetry/monitoring purposes. + */ private String applicationId; + /** + * Comma-delimited list of headers applied to each request sent with client. + */ private final List headers = new ArrayList<>(); @Override diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpClientCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpClientCP.java index f3ee9a5024a8..62456adb7ca0 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpClientCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpClientCP.java @@ -4,8 +4,6 @@ package com.azure.spring.cloud.autoconfigure.properties.core.client; import com.azure.spring.core.aware.ClientAware; -import com.azure.spring.core.properties.client.LoggingProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; import java.time.Duration; @@ -20,8 +18,7 @@ public class HttpClientCP extends ClientCP implements ClientAware.HttpClient { private Duration connectTimeout; private Integer maximumConnectionPoolSize; private Duration connectionIdleTimeout; - @NestedConfigurationProperty - private final LoggingProperties logging = new LoggingProperties(); + private final HttpLoggingCP logging = new HttpLoggingCP(); @Override public Duration getWriteTimeout() { @@ -75,7 +72,8 @@ public void setConnectionIdleTimeout(Duration connectionIdleTimeout) { } @Override - public LoggingProperties getLogging() { + public HttpLoggingCP getLogging() { return logging; } + } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpLoggingCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpLoggingCP.java new file mode 100644 index 000000000000..551dfa112811 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpLoggingCP.java @@ -0,0 +1,58 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.properties.core.client; + +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.spring.core.aware.ClientAware; + +import java.util.HashSet; +import java.util.Set; + +/** + * Options related to http logging. For example, if you want to log the http request or response, you could set the + * * level to {@link HttpLogDetailLevel#BASIC} or some other levels. + */ +public class HttpLoggingCP implements ClientAware.HttpLogging { + + /** + * The level of detail to log on HTTP messages. + */ + private HttpLogDetailLevel level; + /** + * Comma-delimited list of whitelisted headers that should be logged. + */ + private final Set allowedHeaderNames = new HashSet<>(); + /** + * Comma-delimited list of whitelisted query parameters. + */ + private final Set allowedQueryParamNames = new HashSet<>(); + /** + * Whether to pretty print the message bodies. + */ + private Boolean prettyPrintBody; + + public HttpLogDetailLevel getLevel() { + return level; + } + + public void setLevel(HttpLogDetailLevel level) { + this.level = level; + } + + public Set getAllowedHeaderNames() { + return allowedHeaderNames; + } + + public Set getAllowedQueryParamNames() { + return allowedQueryParamNames; + } + + public Boolean getPrettyPrintBody() { + return prettyPrintBody; + } + + public void setPrettyPrintBody(Boolean prettyPrintBody) { + this.prettyPrintBody = prettyPrintBody; + } +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java index abb1d6700182..35f410386d0f 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java @@ -13,11 +13,22 @@ */ public class AzureProfileCP implements AzureProfileAware.Profile { + /** + * Tenant id for Azure resources. + */ private String tenantId; + /** + * Subscription id to use when connecting to Azure resources. + */ private String subscriptionId; + /** + * Name of the Azure cloud to connect to. + */ private AzureProfileAware.CloudType cloud = AzureProfileAware.CloudType.AZURE; + @NestedConfigurationProperty private AzureEnvironment environment = KnownAzureEnvironment.AZURE_ENV; + private final AzureEnvironment otherAzureEnvironment = new AzureEnvironment(com.azure.core.management.AzureEnvironment.AZURE); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/proxy/HttpProxyCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/proxy/HttpProxyCP.java index de85405500c2..326bd57f3751 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/proxy/HttpProxyCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/proxy/HttpProxyCP.java @@ -3,11 +3,24 @@ package com.azure.spring.cloud.autoconfigure.properties.core.proxy; -import com.azure.spring.core.properties.proxy.HttpProxyProperties; +import com.azure.spring.core.aware.ProxyAware; /** * HTTP-based proxy properties for all Azure HTTP SDKs. */ -public class HttpProxyCP extends HttpProxyProperties { +public class HttpProxyCP extends ProxyCP implements ProxyAware.HttpProxy { + + /** + * A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through. + */ + private String nonProxyHosts; + + public String getNonProxyHosts() { + return nonProxyHosts; + } + + public void setNonProxyHosts(String nonProxyHosts) { + this.nonProxyHosts = nonProxyHosts; + } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/proxy/ProxyCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/proxy/ProxyCP.java index a872ab640471..4abef0f4ed25 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/proxy/ProxyCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/proxy/ProxyCP.java @@ -3,11 +3,89 @@ package com.azure.spring.cloud.autoconfigure.properties.core.proxy; -import com.azure.spring.core.properties.proxy.ProxyProperties; +import com.azure.spring.core.aware.ProxyAware; /** * Common proxy properties for all Azure SDKs. */ -public class ProxyCP extends ProxyProperties { +public class ProxyCP implements ProxyAware.Proxy { + /** + * Type of the proxy. + */ + private String type; + /** + * The host of the proxy. + */ + private String hostname; + /** + * The port of the proxy. + */ + private Integer port; + /** + * Authentication type used against the proxy. + */ + private String authenticationType; + /** + * Username used to authenticate with the proxy. + */ + private String username; + /** + * Password used to authenticate with the proxy. + */ + private String password; + + @Override + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @Override + public String getHostname() { + return hostname; + } + + public void setHostname(String hostname) { + this.hostname = hostname; + } + + @Override + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + + @Override + public String getAuthenticationType() { + return authenticationType; + } + + public void setAuthenticationType(String authenticationType) { + this.authenticationType = authenticationType; + } + + @Override + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + @Override + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/HttpRetryCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/HttpRetryCP.java index 76a1284ece25..3efa4af70eeb 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/HttpRetryCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/HttpRetryCP.java @@ -4,53 +4,24 @@ package com.azure.spring.cloud.autoconfigure.properties.core.retry; import com.azure.spring.core.aware.RetryAware; -import com.azure.spring.core.properties.retry.BackoffProperties; -import java.time.Duration; import java.time.temporal.ChronoUnit; /** * Unified http retry properties for all Azure SDKs based on HTTP. */ -public class HttpRetryCP implements RetryAware.HttpRetry { +public class HttpRetryCP extends RetryCP implements RetryAware.HttpRetry { - private final Backoff backoff = new Backoff(); /** - * The maximum number of attempts + * HTTP header, such as Retry-After or x-ms-retry-after-ms, to lookup for the retry delay. + * If the value is null, will calculate the delay using backoff and ignore the delay provided in response header. */ - private Integer maxAttempts; + private String retryAfterHeader; /** - * How long to wait until a timeout + * Time unit to use when applying the retry delay. */ - private Duration timeout; - - private String retryAfterHeader; private ChronoUnit retryAfterTimeUnit; - @Override - public Backoff getBackoff() { - return backoff; - } - - @Override - public Integer getMaxAttempts() { - return maxAttempts; - } - - public void setMaxAttempts(Integer maxAttempts) { - this.maxAttempts = maxAttempts; - } - - @Override - public Duration getTimeout() { - return timeout; - } - - public void setTimeout(Duration timeout) { - this.timeout = timeout; - } - - @Override public String getRetryAfterHeader() { return retryAfterHeader; } @@ -59,7 +30,6 @@ public void setRetryAfterHeader(String retryAfterHeader) { this.retryAfterHeader = retryAfterHeader; } - @Override public ChronoUnit getRetryAfterTimeUnit() { return retryAfterTimeUnit; } @@ -67,8 +37,4 @@ public ChronoUnit getRetryAfterTimeUnit() { public void setRetryAfterTimeUnit(ChronoUnit retryAfterTimeUnit) { this.retryAfterTimeUnit = retryAfterTimeUnit; } - - static class Backoff extends BackoffProperties { - - } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/RetryCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/RetryCP.java index ef3da87b652d..aabd25cd499d 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/RetryCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/RetryCP.java @@ -4,7 +4,6 @@ package com.azure.spring.cloud.autoconfigure.properties.core.retry; import com.azure.spring.core.aware.RetryAware; -import com.azure.spring.core.properties.retry.BackoffProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; import java.time.Duration; @@ -17,11 +16,11 @@ public class RetryCP implements RetryAware.Retry { @NestedConfigurationProperty private final Backoff backoff = new Backoff(); /** - * The maximum number of attempts + * The maximum number of attempts. */ private Integer maxAttempts; /** - * How long to wait until a timeout + * Amount of time to wait until a timeout. */ private Duration timeout; @@ -48,7 +47,43 @@ public void setTimeout(Duration timeout) { /** * Backoff properties when a retry fails. */ - public static class Backoff extends BackoffProperties { + public static class Backoff implements RetryAware.Backoff { + /** + * Amount of time to wait between retry attempts. + */ + private Duration delay; + /** + * Maximum permissible amount of time between retry attempts. + */ + private Duration maxDelay; + /** + * Multiplier used to calculate the next backoff delay. If positive, then used as a multiplier for generating + * the next delay for backoff. + */ + private Double multiplier; + public Duration getDelay() { + return delay; + } + + public void setDelay(Duration delay) { + this.delay = delay; + } + + public Duration getMaxDelay() { + return maxDelay; + } + + public void setMaxDelay(Duration maxDelay) { + this.maxDelay = maxDelay; + } + + public Double getMultiplier() { + return multiplier; + } + + public void setMultiplier(Double multiplier) { + this.multiplier = multiplier; + } } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java index 67418ed94c35..5d3c4614d94a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java @@ -10,7 +10,9 @@ import java.time.Duration; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE; import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_CHINA; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.OTHER; import static org.assertj.core.api.Assertions.assertThat; class AzureGlobalPropertiesAutoConfigurationTest { @@ -28,10 +30,7 @@ void testAutoConfiguration() { @Test void testAzureProperties() { - final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(AzureGlobalPropertiesAutoConfiguration.class)); - - contextRunner + this.contextRunner .withPropertyValues( "spring.cloud.azure.client.application-id=fake-application-id", "spring.cloud.azure.credential.client-id=fake-client-id", @@ -65,4 +64,33 @@ void testAzureProperties() { }); } + @Test + void testAzureProfileOther() { + this.contextRunner + .withPropertyValues( + "spring.cloud.azure.profile.environment.activeDirectoryEndpoint=abc", + "spring.cloud.azure.profile.cloud=other" + ) + .run(context -> { + final AzureGlobalProperties azureProperties = context.getBean(AzureGlobalProperties.class); + assertThat(azureProperties).extracting("profile.cloud").isEqualTo(OTHER); + assertThat(azureProperties).extracting("profile.environment.activeDirectoryEndpoint").isEqualTo("abc"); + }); + } + + @Test + void testAzureProfileAzure() { + this.contextRunner + .withPropertyValues( + "spring.cloud.azure.profile.environment.activeDirectoryEndpoint=abc", + "spring.cloud.azure.profile.cloud=azure" + ) + .run(context -> { + final AzureGlobalProperties azureProperties = context.getBean(AzureGlobalProperties.class); + assertThat(azureProperties).extracting("profile.cloud").isEqualTo(AZURE); + assertThat(azureProperties).extracting("profile.environment.activeDirectoryEndpoint") + .isEqualTo(AzureEnvironment.AZURE.getActiveDirectoryEndpoint()); + }); + } + } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/ClientAware.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/ClientAware.java index c0543812a7c8..995cc322a27d 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/ClientAware.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/ClientAware.java @@ -66,12 +66,28 @@ interface AmqpClient extends Client { */ interface HttpLogging { + /** + * Gets the level of detail to log on HTTP messages. + * @return the http log detail level. + */ HttpLogDetailLevel getLevel(); + /** + * Gets the whitelisted headers that should be logged. + * @return The list of whitelisted headers. + */ Set getAllowedHeaderNames(); + /** + * Gets the whitelisted query parameters. + * @return The list of whitelisted query parameters. + */ Set getAllowedQueryParamNames(); + /** + * Gets flag to allow pretty printing of message bodies. + * @return whether to pretty print the message bodies. + */ Boolean getPrettyPrintBody(); } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/RetryAware.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/RetryAware.java index 282923c60eb5..1433d3370773 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/RetryAware.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/RetryAware.java @@ -18,8 +18,16 @@ public interface RetryAware { */ interface Retry { + /** + * The maximum number of attempts. + * @return the max attempts. + */ Integer getMaxAttempts(); + /** + * Amount of time to wait until a timeout. + * @return the timeout. + */ Duration getTimeout(); Backoff getBackoff(); diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/authentication/TokenCredentialProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/authentication/TokenCredentialProperties.java index 4957df3ca658..785c02949288 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/authentication/TokenCredentialProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/authentication/TokenCredentialProperties.java @@ -37,10 +37,6 @@ public class TokenCredentialProperties implements TokenCredentialAware.TokenCred private String managedIdentityClientId; - public TokenCredentialProperties() { - - } - public String getClientId() { return clientId; } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/HttpClientProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/HttpClientProperties.java index d92cdece3594..2995142c7fde 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/HttpClientProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/HttpClientProperties.java @@ -18,7 +18,7 @@ public final class HttpClientProperties extends ClientProperties implements Clie private Duration connectTimeout; private Duration connectionIdleTimeout; private Integer maximumConnectionPoolSize; - private final LoggingProperties logging = new LoggingProperties(); + private final HttpLoggingProperties logging = new HttpLoggingProperties(); public Duration getWriteTimeout() { return writeTimeout; @@ -72,7 +72,7 @@ public void setConnectionIdleTimeout(Duration connectionIdleTimeout) { } @Override - public LoggingProperties getLogging() { + public HttpLoggingProperties getLogging() { return logging; } } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/LoggingProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/HttpLoggingProperties.java similarity index 78% rename from sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/LoggingProperties.java rename to sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/HttpLoggingProperties.java index 0321da7f7a4c..4bc80fc88ff2 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/LoggingProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/HttpLoggingProperties.java @@ -13,11 +13,23 @@ * Options related to http logging. For example, if you want to log the http request or response, you could set the * level to {@link HttpLogDetailLevel#BASIC} or some other levels. */ -public class LoggingProperties implements ClientAware.HttpLogging { +public class HttpLoggingProperties implements ClientAware.HttpLogging { + /** + * Gets the level of detail to log on HTTP messages. + */ private HttpLogDetailLevel level; + /** + * The whitelisted headers that should be logged. + */ private final Set allowedHeaderNames = new HashSet<>(); + /** + * The whitelisted query parameters. + */ private final Set allowedQueryParamNames = new HashSet<>(); + /** + * Whether to pretty print the message bodies. + */ private Boolean prettyPrintBody; public HttpLogDetailLevel getLevel() { diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureEnvironment.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureEnvironment.java index ceace0fc565d..bd3ed6f1d6e7 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureEnvironment.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureEnvironment.java @@ -24,6 +24,9 @@ public class AzureEnvironment implements AzureProfileAware.Environment { private String sqlManagementEndpoint; private String sqlServerHostnameSuffix; private String galleryEndpoint; + /** + * The Azure Active Directory endpoint to connect to. + */ private String activeDirectoryEndpoint; private String activeDirectoryResourceId; private String activeDirectoryGraphEndpoint; diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/proxy/HttpProxyProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/proxy/HttpProxyProperties.java index 3fb8256464df..d6f3e42400d5 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/proxy/HttpProxyProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/proxy/HttpProxyProperties.java @@ -10,6 +10,9 @@ */ public class HttpProxyProperties extends ProxyProperties implements ProxyAware.HttpProxy { + /** + * A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through. + */ private String nonProxyHosts; public String getNonProxyHosts() { diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/retry/BackoffProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/retry/BackoffProperties.java index e06c750a6b7e..9b1ea6dbb782 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/retry/BackoffProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/retry/BackoffProperties.java @@ -16,9 +16,8 @@ public class BackoffProperties implements RetryAware.Backoff { private Duration maxDelay; /** - * If positive, then used as a multiplier for generating the next delay for backoff. - * - * @return a multiplier to use to calculate the next backoff delay + * Multiplier used to calculate the next backoff delay. If positive, then used as a multiplier for generating the + * next delay for backoff. */ private Double multiplier; From 0988cd9a600c93abe8bcb59a6c6f6a38f276b3f7 Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Thu, 11 Nov 2021 23:35:13 +0800 Subject: [PATCH 09/15] refactor the profile.cloud and profile.environment --- ...zureGlobalPropertiesAutoConfiguration.java | 23 +++++ .../core/profile/AzureProfileCP.java | 25 +---- .../AzureServiceConfigurationBaseTest.java | 44 +++++++++ ...GlobalPropertiesAutoConfigurationTest.java | 20 +++- .../spring/core/aware/AzureProfileAware.java | 10 +- ...tractAzureServiceClientBuilderFactory.java | 1 + .../core/properties/AzurePropertiesUtils.java | 20 +++- .../core/properties/profile/AzureProfile.java | 26 ++--- .../profile/AzureProfileAdapter.java | 42 ++++++++ .../profile/KnownAzureEnvironment.java | 99 ------------------- .../properties/AzurePropertiesUtilsTest.java | 33 +++++-- 11 files changed, 187 insertions(+), 156 deletions(-) create mode 100644 sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfileAdapter.java diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfiguration.java index 493e422b9c2d..9aef0f795abd 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfiguration.java @@ -4,9 +4,14 @@ package com.azure.spring.cloud.autoconfigure.context; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; +import com.azure.spring.core.aware.AzureProfileAware; +import com.azure.spring.core.properties.AzureProperties; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.env.Environment; @@ -44,4 +49,22 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, } } + + @Bean + public AzurePropertiesBeanPostProcessor azurePropertiesBeanPostProcessor() { + return new AzurePropertiesBeanPostProcessor(); + } + + static class AzurePropertiesBeanPostProcessor implements BeanPostProcessor { + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof AzureProperties) { + AzureProfileAware.Profile profile = ((AzureProperties) bean).getProfile(); + profile.afterPropertiesSet(); + } + return bean; + } + + } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java index 35f410386d0f..fd69bc012675 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java @@ -5,13 +5,13 @@ import com.azure.spring.core.aware.AzureProfileAware; import com.azure.spring.core.properties.profile.AzureEnvironment; -import com.azure.spring.core.properties.profile.KnownAzureEnvironment; +import com.azure.spring.core.properties.profile.AzureProfileAdapter; import org.springframework.boot.context.properties.NestedConfigurationProperty; /** * The AzureProfile defines the properties related to an Azure subscription. */ -public class AzureProfileCP implements AzureProfileAware.Profile { +public class AzureProfileCP extends AzureProfileAdapter { /** * Tenant id for Azure resources. @@ -27,10 +27,7 @@ public class AzureProfileCP implements AzureProfileAware.Profile { private AzureProfileAware.CloudType cloud = AzureProfileAware.CloudType.AZURE; @NestedConfigurationProperty - private AzureEnvironment environment = KnownAzureEnvironment.AZURE_ENV; - - private final AzureEnvironment otherAzureEnvironment = - new AzureEnvironment(com.azure.core.management.AzureEnvironment.AZURE); + private final AzureEnvironment environment = new AzureEnvironment(); public String getTenantId() { return tenantId; @@ -51,7 +48,6 @@ public AzureProfileAware.CloudType getCloud() { public void setCloud(AzureProfileAware.CloudType cloud) { this.cloud = cloud; - this.environment = decideAzureEnvironment(); } public void setSubscriptionId(String subscriptionId) { @@ -62,19 +58,4 @@ public AzureEnvironment getEnvironment() { return this.environment; } - private AzureEnvironment decideAzureEnvironment() { - switch (cloud) { - case AZURE_CHINA: - return KnownAzureEnvironment.AZURE_CHINA_ENV; - case AZURE_US_GOVERNMENT: - return KnownAzureEnvironment.AZURE_US_GOVERNMENT_ENV; - case AZURE_GERMANY: - return KnownAzureEnvironment.AZURE_GERMANY_ENV; - case AZURE: - return KnownAzureEnvironment.AZURE_ENV; - default: - return otherAzureEnvironment; - } - } - } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBaseTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBaseTest.java index ba98ab8510f9..2cdb899adf09 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBaseTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBaseTest.java @@ -24,6 +24,9 @@ import java.util.HashSet; import java.util.Set; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_CHINA; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.OTHER; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; @@ -53,6 +56,7 @@ void configureGlobalShouldApplyToAzureCosmosProperties() { azureProperties.getRetry().getBackoff().setDelay(Duration.ofMillis(2)); azureProperties.getRetry().setMaxAttempts(3); azureProperties.getRetry().getHttp().setRetryAfterHeader("x-ms-xxx"); + azureProperties.getProfile().getEnvironment().setActiveDirectoryEndpoint("abc"); this.contextRunner .withBean(AzureGlobalProperties.class, () -> azureProperties) @@ -76,6 +80,9 @@ void configureGlobalShouldApplyToAzureCosmosProperties() { assertThat(properties).extracting("retry.maxAttempts").isEqualTo(null); assertThat(properties).extracting("retry.backoff.delay").isEqualTo(null); + assertThat(properties).extracting("profile.cloud").isEqualTo(AZURE); + assertThat(properties).extracting("profile.environment.activeDirectoryEndpoint").isEqualTo("abc"); + assertThat(properties).extracting("endpoint").isEqualTo(TEST_ENDPOINT_HTTPS); assertThat(properties).extracting("key").isEqualTo("cosmos-key"); @@ -93,6 +100,35 @@ void configureGlobalShouldApplyToAzureCosmosProperties() { }); } + @Test + void configureEnvGlobalAndCosmosShouldApplyCosmos() { + AzureGlobalProperties azureProperties = new AzureGlobalProperties(); + azureProperties.getProfile().getEnvironment().setActiveDirectoryEndpoint("abc"); + azureProperties.getProfile().getEnvironment().setActiveDirectoryGraphApiVersion("v2"); + azureProperties.getProfile().setCloud(AZURE_CHINA); + + this.contextRunner + .withBean(AzureGlobalProperties.class, () -> azureProperties) + .withBean(CosmosClientBuilder.class, () -> mock(CosmosClientBuilder.class)) + .withPropertyValues( + "spring.cloud.azure.cosmos.endpoint=" + TEST_ENDPOINT_HTTPS, + "spring.cloud.azure.cosmos.key=cosmos-key", + "spring.cloud.azure.cosmos.profile.cloud=other", + "spring.cloud.azure.cosmos.profile.environment.activeDirectoryEndpoint=bcd" + ) + .run(context -> { + assertThat(context).hasSingleBean(AzureCosmosProperties.class); + final AzureCosmosProperties properties = context.getBean(AzureCosmosProperties.class); + + assertThat(properties).extracting("profile.cloud").isEqualTo(OTHER); + assertThat(properties).extracting("profile.environment.activeDirectoryEndpoint").isEqualTo("bcd"); + assertThat(properties).extracting("profile.environment.activeDirectoryGraphApiVersion").isEqualTo("v2"); + + assertThat(properties).extracting("endpoint").isEqualTo(TEST_ENDPOINT_HTTPS); + assertThat(properties).extracting("key").isEqualTo("cosmos-key"); + }); + } + @Test void configureGlobalShouldApplyToAmqpAzureEventHubsProperties() { AzureGlobalProperties azureProperties = new AzureGlobalProperties(); @@ -108,6 +144,7 @@ void configureGlobalShouldApplyToAmqpAzureEventHubsProperties() { azureProperties.getRetry().getBackoff().setDelay(Duration.ofMillis(2)); azureProperties.getRetry().setMaxAttempts(3); azureProperties.getRetry().getHttp().setRetryAfterHeader("x-ms-xxx"); + azureProperties.getProfile().getEnvironment().setActiveDirectoryEndpoint("abc"); this.contextRunner .withBean(AzureGlobalProperties.class, () -> azureProperties) @@ -130,6 +167,9 @@ void configureGlobalShouldApplyToAmqpAzureEventHubsProperties() { assertThat(properties).extracting("namespace").isEqualTo("test"); + assertThat(properties).extracting("profile.cloud").isEqualTo(AZURE); + assertThat(properties).extracting("profile.environment.activeDirectoryEndpoint").isEqualTo("abc"); + assertThatThrownBy(() -> Extractors.byName("client.connectTimeout").apply(properties)) .isInstanceOf(IntrospectionError.class); assertThatThrownBy(() -> Extractors.byName("client.logging.level").apply(properties)) @@ -159,6 +199,7 @@ void configureGlobalShouldApplyToHttpAzureKeyVaultSecretProperties() { azureProperties.getRetry().getBackoff().setDelay(Duration.ofMillis(2)); azureProperties.getRetry().setMaxAttempts(3); azureProperties.getRetry().getHttp().setRetryAfterHeader("x-ms-xxx"); + azureProperties.getProfile().getEnvironment().setActiveDirectoryEndpoint("abc"); this.contextRunner .withBean(AzureGlobalProperties.class, () -> azureProperties) @@ -186,6 +227,9 @@ void configureGlobalShouldApplyToHttpAzureKeyVaultSecretProperties() { assertThat(properties).extracting("retry.retryAfterHeader").isEqualTo("x-ms-xxx"); assertThat(properties).extracting("retry.backoff.delay").isEqualTo(Duration.ofMillis(2)); + assertThat(properties).extracting("profile.cloud").isEqualTo(AZURE); + assertThat(properties).extracting("profile.environment.activeDirectoryEndpoint").isEqualTo("abc"); + assertThat(properties).extracting("endpoint").isEqualTo("test"); assertThatThrownBy(() -> Extractors.byName("client.transportType").apply(properties)) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java index 5d3c4614d94a..5fdeca1ef7f3 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfigurationTest.java @@ -65,7 +65,7 @@ void testAzureProperties() { } @Test - void testAzureProfileOther() { + void testAzureProfileOtherCouldModifyEndpoint() { this.contextRunner .withPropertyValues( "spring.cloud.azure.profile.environment.activeDirectoryEndpoint=abc", @@ -79,7 +79,7 @@ void testAzureProfileOther() { } @Test - void testAzureProfileAzure() { + void testAzureProfileAzureCouldModifyEndpoint() { this.contextRunner .withPropertyValues( "spring.cloud.azure.profile.environment.activeDirectoryEndpoint=abc", @@ -89,7 +89,21 @@ void testAzureProfileAzure() { final AzureGlobalProperties azureProperties = context.getBean(AzureGlobalProperties.class); assertThat(azureProperties).extracting("profile.cloud").isEqualTo(AZURE); assertThat(azureProperties).extracting("profile.environment.activeDirectoryEndpoint") - .isEqualTo(AzureEnvironment.AZURE.getActiveDirectoryEndpoint()); + .isEqualTo("abc"); + }); + } + + @Test + void testAzureProfileAzureChina() { + this.contextRunner + .withPropertyValues( + "spring.cloud.azure.profile.cloud=azure_china" + ) + .run(context -> { + final AzureGlobalProperties azureProperties = context.getBean(AzureGlobalProperties.class); + assertThat(azureProperties).extracting("profile.cloud").isEqualTo(AZURE_CHINA); + assertThat(azureProperties).extracting("profile.environment.activeDirectoryEndpoint") + .isEqualTo(AzureEnvironment.AZURE_CHINA.getActiveDirectoryEndpoint()); }); } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java index a1f0207f52c4..61555d19f17c 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java @@ -3,6 +3,8 @@ package com.azure.spring.core.aware; +import org.springframework.beans.factory.InitializingBean; + /** * Interface to be implemented by classes that wish to be aware of the Azure profile. */ @@ -13,7 +15,7 @@ public interface AzureProfileAware { /** * Interface to be implemented by classes that wish to describe an Azure cloud profile. */ - interface Profile { + interface Profile extends InitializingBean { String getTenantId(); @@ -23,13 +25,16 @@ interface Profile { Environment getEnvironment(); + @Override + void afterPropertiesSet(); } /** - * Define the cloud environment type, with four known Azure cloud type and the types don't fall in the four known + * Define the cloud environment type, with four known Azure cloud types and the types don't fall in the four known * types will be OTHER. */ enum CloudType { + AZURE, AZURE_CHINA, AZURE_GERMANY, @@ -81,4 +86,5 @@ interface Environment { String getAzureApplicationInsightsEndpoint(); } + } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AbstractAzureServiceClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AbstractAzureServiceClientBuilderFactory.java index 0d08e79a6ede..ab36112bdb13 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AbstractAzureServiceClientBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AbstractAzureServiceClientBuilderFactory.java @@ -104,6 +104,7 @@ protected void configureApplicationId(T builder) { protected void configureAzureEnvironment(T builder) { AzureProfileAware.Profile profile = getAzureProperties().getProfile(); + profile.afterPropertiesSet(); Configuration configuration = new Configuration(); configuration.put(Configuration.PROPERTY_AZURE_AUTHORITY_HOST, profile.getEnvironment().getActiveDirectoryEndpoint()); diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzurePropertiesUtils.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzurePropertiesUtils.java index 7c5176fcd89a..83771fbf81c3 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzurePropertiesUtils.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzurePropertiesUtils.java @@ -10,7 +10,9 @@ import java.beans.PropertyDescriptor; import java.util.HashSet; +import java.util.Objects; import java.util.Set; +import java.util.function.Predicate; /** * @@ -40,6 +42,7 @@ public static void copyAzureCommonProperties(AzurePr BeanUtils.copyProperties(source.getRetry(), target.getRetry()); BeanUtils.copyProperties(source.getRetry().getBackoff(), target.getRetry().getBackoff()); BeanUtils.copyProperties(source.getProfile(), target.getProfile()); + BeanUtils.copyProperties(source.getProfile().getEnvironment(), target.getProfile().getEnvironment()); BeanUtils.copyProperties(source.getCredential(), target.getCredential()); } @@ -60,6 +63,7 @@ public static void copyAzureCommonPropertiesIgnoreNu copyPropertiesIgnoreNull(source.getRetry(), target.getRetry()); copyPropertiesIgnoreNull(source.getRetry().getBackoff(), target.getRetry().getBackoff()); copyPropertiesIgnoreNull(source.getProfile(), target.getProfile()); + BeanUtils.copyProperties(source.getProfile().getEnvironment(), target.getProfile().getEnvironment()); copyPropertiesIgnoreNull(source.getCredential(), target.getCredential()); } @@ -70,11 +74,15 @@ public static void mergeAzureCommonProperties(AzureP copyAzureCommonPropertiesIgnoreNull(properties, target); } + public static void copyPropertiesWhenTargetIsNull(T source, T target) { + BeanUtils.copyProperties(source, target, findNonNullPropertyNames(target)); + } + private static void copyPropertiesIgnoreNull(Object source, Object target) { BeanUtils.copyProperties(source, target, findNullPropertyNames(source)); } - private static String[] findNullPropertyNames(Object source) { + private static String[] findPropertyNames(Object source, Predicate predicate) { final Set emptyNames = new HashSet<>(); final BeanWrapper beanWrapper = new BeanWrapperImpl(source); @@ -82,12 +90,20 @@ private static String[] findNullPropertyNames(Object source) { for (PropertyDescriptor pd : pds) { Object srcValue = beanWrapper.getPropertyValue(pd.getName()); - if (srcValue == null) { + if (predicate.test(srcValue)) { emptyNames.add(pd.getName()); } } return emptyNames.toArray(new String[0]); } + private static String[] findNonNullPropertyNames(Object source) { + return findPropertyNames(source, Objects::nonNull); + } + + private static String[] findNullPropertyNames(Object source) { + return findPropertyNames(source, Objects::isNull); + } + } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfile.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfile.java index 31972775e6c9..a28f2cbe6ba1 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfile.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfile.java @@ -5,15 +5,17 @@ import com.azure.spring.core.aware.AzureProfileAware; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE; + /** * The AzureProfile defines the properties related to an Azure subscription. */ -public class AzureProfile implements AzureProfileAware.Profile { +public class AzureProfile extends AzureProfileAdapter { private String tenantId; private String subscriptionId; - private AzureProfileAware.CloudType cloud = AzureProfileAware.CloudType.AZURE; - private final AzureEnvironment otherEnvironment = new AzureEnvironment(com.azure.core.management.AzureEnvironment.AZURE); + private AzureProfileAware.CloudType cloud = AZURE; + private final AzureEnvironment environment = new AzureEnvironment(); public String getTenantId() { return tenantId; @@ -40,23 +42,9 @@ public void setCloud(AzureProfileAware.CloudType cloud) { this.cloud = cloud; } + @Override public AzureEnvironment getEnvironment() { - switch (cloud) { - case AZURE_CHINA: - return KnownAzureEnvironment.AZURE_CHINA_ENV; - case AZURE_US_GOVERNMENT: - return KnownAzureEnvironment.AZURE_US_GOVERNMENT_ENV; - case AZURE_GERMANY: - return KnownAzureEnvironment.AZURE_GERMANY_ENV; - case AZURE: - return KnownAzureEnvironment.AZURE_ENV; - default: - return otherEnvironment; - } + return environment; } - - - - } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfileAdapter.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfileAdapter.java new file mode 100644 index 000000000000..7869ea716004 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfileAdapter.java @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.properties.profile; + +import com.azure.spring.core.aware.AzureProfileAware; + +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_CHINA; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_GERMANY; +import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_US_GOVERNMENT; +import static com.azure.spring.core.properties.AzurePropertiesUtils.copyPropertiesWhenTargetIsNull; + +/** + * Skeleton implementation of a {@link AzureProfileAware.Profile}. + */ +public abstract class AzureProfileAdapter implements AzureProfileAware.Profile { + + @Override + public void afterPropertiesSet() { + AzureEnvironment defaultEnvironment = decideAzureEnvironment(this.getCloud()); + copyPropertiesWhenTargetIsNull(defaultEnvironment, this.getEnvironment()); + } + + public abstract AzureEnvironment getEnvironment(); + + private AzureEnvironment decideAzureEnvironment(AzureProfileAware.CloudType cloud) { + switch (cloud) { + case AZURE_CHINA: + return new KnownAzureEnvironment(AZURE_CHINA); + case AZURE_US_GOVERNMENT: + return new KnownAzureEnvironment(AZURE_US_GOVERNMENT); + case AZURE_GERMANY: + return new KnownAzureEnvironment(AZURE_GERMANY); + case AZURE: + return new KnownAzureEnvironment(AZURE); + default: + return new AzureEnvironment(); + } + } + +} diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/KnownAzureEnvironment.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/KnownAzureEnvironment.java index 009aca9b2f82..09ca14b20dbb 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/KnownAzureEnvironment.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/KnownAzureEnvironment.java @@ -4,14 +4,8 @@ package com.azure.spring.core.properties.profile; import com.azure.spring.core.aware.AzureProfileAware; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.util.Assert; -import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE; -import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_CHINA; -import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_GERMANY; -import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_US_GOVERNMENT; import static com.azure.spring.core.aware.AzureProfileAware.CloudType.OTHER; /** @@ -19,18 +13,8 @@ */ public class KnownAzureEnvironment extends AzureEnvironment { - private static final Logger LOGGER = LoggerFactory.getLogger(KnownAzureEnvironment.class); - - public static final KnownAzureEnvironment AZURE_CHINA_ENV = new KnownAzureEnvironment(AZURE_CHINA); - public static final KnownAzureEnvironment AZURE_ENV = new KnownAzureEnvironment(AZURE); - public static final KnownAzureEnvironment AZURE_GERMANY_ENV = new KnownAzureEnvironment(AZURE_GERMANY); - public static final KnownAzureEnvironment AZURE_US_GOVERNMENT_ENV = new KnownAzureEnvironment(AZURE_US_GOVERNMENT); - private final AzureProfileAware.CloudType type; - - public KnownAzureEnvironment(AzureProfileAware.CloudType cloudType) { super(convertToManagementAzureEnvironmentByType(cloudType)); - this.type = cloudType; } private static com.azure.core.management.AzureEnvironment convertToManagementAzureEnvironmentByType( @@ -48,87 +32,4 @@ private static com.azure.core.management.AzureEnvironment convertToManagementAzu } } - @Override - public com.azure.core.management.AzureEnvironment toManagementAzureEnvironment() { - return convertToManagementAzureEnvironmentByType(this.type); - } - - public void setPortal(String portal) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setPublishingProfile(String publishingProfile) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setManagementEndpoint(String managementEndpoint) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setResourceManagerEndpoint(String resourceManagerEndpoint) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setSqlManagementEndpoint(String sqlManagementEndpoint) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setSqlServerHostnameSuffix(String sqlServerHostnameSuffix) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setGalleryEndpoint(String galleryEndpoint) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setActiveDirectoryEndpoint(String activeDirectoryEndpoint) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setActiveDirectoryResourceId(String activeDirectoryResourceId) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setActiveDirectoryGraphEndpoint(String activeDirectoryGraphEndpoint) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setMicrosoftGraphEndpoint(String microsoftGraphEndpoint) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setDataLakeEndpointResourceId(String dataLakeEndpointResourceId) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setActiveDirectoryGraphApiVersion(String activeDirectoryGraphApiVersion) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setStorageEndpointSuffix(String storageEndpointSuffix) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setKeyVaultDnsSuffix(String keyVaultDnsSuffix) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setAzureDataLakeStoreFileSystemEndpointSuffix(String azureDataLakeStoreFileSystemEndpointSuffix) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setAzureDataLakeAnalyticsCatalogAndJobEndpointSuffix(String azureDataLakeAnalyticsCatalogAndJobEndpointSuffix) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setAzureLogAnalyticsEndpoint(String azureLogAnalyticsEndpoint) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - public void setAzureApplicationInsightsEndpoint(String azureApplicationInsightsEndpoint) { - LOGGER.warn("Set method is not supported in a KnownAzureEnvironment"); - } - - - } diff --git a/sdk/spring/spring-cloud-azure-core/src/test/java/com/azure/spring/cloud/core/properties/AzurePropertiesUtilsTest.java b/sdk/spring/spring-cloud-azure-core/src/test/java/com/azure/spring/cloud/core/properties/AzurePropertiesUtilsTest.java index cf4e4b6d2962..c601d4a5ed92 100644 --- a/sdk/spring/spring-cloud-azure-core/src/test/java/com/azure/spring/cloud/core/properties/AzurePropertiesUtilsTest.java +++ b/sdk/spring/spring-cloud-azure-core/src/test/java/com/azure/spring/cloud/core/properties/AzurePropertiesUtilsTest.java @@ -3,6 +3,7 @@ package com.azure.spring.cloud.core.properties; +import com.azure.core.management.AzureEnvironment; import com.azure.spring.core.properties.AzureProperties; import com.azure.spring.core.properties.AzurePropertiesUtils; import com.azure.spring.core.properties.authentication.TokenCredentialProperties; @@ -18,8 +19,6 @@ import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE; import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_CHINA; import static com.azure.spring.core.aware.AzureProfileAware.CloudType.OTHER; -import static com.azure.spring.core.properties.profile.KnownAzureEnvironment.AZURE_CHINA_ENV; -import static com.azure.spring.core.properties.profile.KnownAzureEnvironment.AZURE_ENV; /** @@ -36,6 +35,7 @@ void testCopyPropertiesToNewObjectShouldEqual() { source.proxy.setHostname("hostname-A"); source.retry.getBackoff().setDelay(Duration.ofSeconds(2)); source.credential.setClientId("client-id-A"); + source.profile.afterPropertiesSet(); final AzurePropertiesB target = new AzurePropertiesB(); AzurePropertiesUtils.copyAzureCommonProperties(source, target); @@ -46,7 +46,8 @@ void testCopyPropertiesToNewObjectShouldEqual() { Assertions.assertEquals("hostname-A", target.proxy.getHostname()); Assertions.assertEquals(Duration.ofSeconds(2), target.retry.getBackoff().getDelay()); Assertions.assertEquals("client-id-A", target.credential.getClientId()); - Assertions.assertEquals(AZURE_CHINA_ENV.getActiveDirectoryEndpoint(), target.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AzureEnvironment.AZURE_CHINA.getActiveDirectoryEndpoint(), + target.profile.getEnvironment().getActiveDirectoryEndpoint()); } @Test @@ -58,6 +59,7 @@ void testCopyPropertiesToObjectWithSameFieldsSetShouldOverride() { source.proxy.setHostname("hostname-A"); source.retry.getBackoff().setDelay(Duration.ofSeconds(2)); source.credential.setClientId("client-id-A"); + source.profile.afterPropertiesSet(); AzurePropertiesB target = new AzurePropertiesB(); target.client.setApplicationId("application-id-B"); @@ -66,6 +68,7 @@ void testCopyPropertiesToObjectWithSameFieldsSetShouldOverride() { target.proxy.setHostname("hostname-B"); target.retry.getBackoff().setDelay(Duration.ofSeconds(4)); target.credential.setClientId("client-id-B"); + target.profile.afterPropertiesSet(); Assertions.assertEquals("application-id-B", target.client.getApplicationId()); Assertions.assertEquals(AZURE, target.profile.getCloud()); @@ -73,7 +76,8 @@ void testCopyPropertiesToObjectWithSameFieldsSetShouldOverride() { Assertions.assertEquals("hostname-B", target.proxy.getHostname()); Assertions.assertEquals(Duration.ofSeconds(4), target.retry.getBackoff().getDelay()); Assertions.assertEquals("client-id-B", target.credential.getClientId()); - Assertions.assertEquals(AZURE_ENV.getActiveDirectoryEndpoint(), target.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AzureEnvironment.AZURE.getActiveDirectoryEndpoint(), + target.profile.getEnvironment().getActiveDirectoryEndpoint()); AzurePropertiesUtils.copyAzureCommonProperties(source, target); @@ -83,7 +87,8 @@ void testCopyPropertiesToObjectWithSameFieldsSetShouldOverride() { Assertions.assertEquals("hostname-A", target.proxy.getHostname()); Assertions.assertEquals(Duration.ofSeconds(2), target.retry.getBackoff().getDelay()); Assertions.assertEquals("client-id-A", target.credential.getClientId()); - Assertions.assertEquals(AZURE_CHINA_ENV.getActiveDirectoryEndpoint(), target.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AzureEnvironment.AZURE_CHINA.getActiveDirectoryEndpoint(), + target.profile.getEnvironment().getActiveDirectoryEndpoint()); } @@ -107,14 +112,18 @@ void testCopyPropertiesToObjectWithDifferentFieldsSetShouldOverrideWithNull() { void testCopyPropertiesIgnoreNullToObjectWithDifferentFieldsSetShouldMerge() { AzurePropertiesA source = new AzurePropertiesA(); source.credential.setClientId("client-id-A"); + source.getProfile().afterPropertiesSet(); AzurePropertiesB target = new AzurePropertiesB(); target.credential.setClientSecret("client-secret-B"); target.retry.getBackoff().setMaxDelay(Duration.ofSeconds(2)); target.profile.setCloud(OTHER); target.profile.getEnvironment().setActiveDirectoryEndpoint("abc"); + target.getProfile().afterPropertiesSet(); - Assertions.assertEquals(AZURE_ENV.getActiveDirectoryEndpoint(), source.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AZURE, source.getProfile().getCloud()); + Assertions.assertEquals(AzureEnvironment.AZURE.getActiveDirectoryEndpoint(), + source.profile.getEnvironment().getActiveDirectoryEndpoint()); Assertions.assertEquals("client-secret-B", target.credential.getClientSecret()); Assertions.assertEquals(Duration.ofSeconds(2), target.retry.getBackoff().getMaxDelay()); @@ -124,18 +133,22 @@ void testCopyPropertiesIgnoreNullToObjectWithDifferentFieldsSetShouldMerge() { Assertions.assertEquals("client-id-A", target.credential.getClientId()); Assertions.assertEquals("client-secret-B", target.credential.getClientSecret()); Assertions.assertEquals(Duration.ofSeconds(2), target.retry.getBackoff().getMaxDelay()); - Assertions.assertEquals(AZURE_ENV.getActiveDirectoryEndpoint(), target.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AZURE, source.getProfile().getCloud()); + Assertions.assertEquals(AzureEnvironment.AZURE.getActiveDirectoryEndpoint(), + target.profile.getEnvironment().getActiveDirectoryEndpoint()); // source properties should not be updated Assertions.assertNull(source.credential.getClientSecret()); - Assertions.assertEquals(AZURE_ENV.getActiveDirectoryEndpoint(), source.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AzureEnvironment.AZURE.getActiveDirectoryEndpoint(), + source.profile.getEnvironment().getActiveDirectoryEndpoint()); } @Test void testCopyPropertiesSourceNotChanged() { AzurePropertiesA source = new AzurePropertiesA(); source.credential.setClientId("client-id-A"); + source.getProfile().afterPropertiesSet(); AzurePropertiesB target = new AzurePropertiesB(); @@ -147,9 +160,11 @@ void testCopyPropertiesSourceNotChanged() { target.retry.getBackoff().setDelay(Duration.ofSeconds(2)); target.profile.setCloud(OTHER); target.profile.getEnvironment().setActiveDirectoryEndpoint("abc"); + target.getProfile().afterPropertiesSet(); Assertions.assertNull(source.retry.getBackoff().getDelay()); - Assertions.assertEquals(AZURE_ENV.getActiveDirectoryEndpoint(), source.profile.getEnvironment().getActiveDirectoryEndpoint()); + Assertions.assertEquals(AzureEnvironment.AZURE.getActiveDirectoryEndpoint(), + source.profile.getEnvironment().getActiveDirectoryEndpoint()); } From 2a699bfc8e7964ae25deb1d177acbc1ff98249f9 Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Sun, 14 Nov 2021 15:57:18 +0800 Subject: [PATCH 10/15] try to fix ITs --- .../eventhubs/AzureBlobCheckpointStoreConfiguration.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/eventhubs/AzureBlobCheckpointStoreConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/AzureBlobCheckpointStoreConfiguration.java index 7e42ad661dbe..673a97dbd5bc 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/AzureBlobCheckpointStoreConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/AzureBlobCheckpointStoreConfiguration.java @@ -51,8 +51,9 @@ public BlobCheckpointStore blobCheckpointStore( return new BlobCheckpointStore(blobContainerAsyncClient); } - @Bean - @ConditionalOnMissingBean + // TODO (xiada): should we remove this initializer by default +// @Bean +// @ConditionalOnMissingBean public BlobCheckpointStoreContainerInitializer blobCheckpointStoreContainerInitializer() { return containerAsyncClient -> { if (Boolean.FALSE.equals(containerAsyncClient.exists().block(Duration.ofSeconds(3)))) { From 2672314cb3f24b20c61a6383c112437e47736b0c Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Mon, 15 Nov 2021 01:02:20 +0800 Subject: [PATCH 11/15] refactor code --- .../core/api/BatchConsumerConfig.java | 63 ----- .../integration/core/api/Batchable.java | 16 -- .../EventHubBatchMessageConverterTest.java | 235 ------------------ .../AbstractAzureAmqpSdkProperties.java | 33 +++ .../AbstractAzureHttpSdkProperties.java | 33 +++ .../AbstractAzureSdkProperties.java | 45 +--- .../core/properties/CommonProperties.java | 4 +- .../ProcessorPropertiesParentMergerTest.java | 13 +- .../ProducerPropertiesParentMergerTest.java | 13 +- 9 files changed, 76 insertions(+), 379 deletions(-) delete mode 100644 sdk/spring/azure-spring-integration-core/src/main/java/com/azure/spring/integration/core/api/BatchConsumerConfig.java delete mode 100644 sdk/spring/azure-spring-integration-core/src/main/java/com/azure/spring/integration/core/api/Batchable.java delete mode 100644 sdk/spring/azure-spring-integration-eventhubs/src/test/java/com/azure/spring/integration/eventhub/converter/EventHubBatchMessageConverterTest.java create mode 100644 sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AbstractAzureAmqpSdkProperties.java create mode 100644 sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AbstractAzureHttpSdkProperties.java diff --git a/sdk/spring/azure-spring-integration-core/src/main/java/com/azure/spring/integration/core/api/BatchConsumerConfig.java b/sdk/spring/azure-spring-integration-core/src/main/java/com/azure/spring/integration/core/api/BatchConsumerConfig.java deleted file mode 100644 index 69122e4b64d2..000000000000 --- a/sdk/spring/azure-spring-integration-core/src/main/java/com/azure/spring/integration/core/api/BatchConsumerConfig.java +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.integration.core.api; - -import java.time.Duration; - -/** - * Batch consumer config. - */ -public class BatchConsumerConfig { - - /** - * The maximum number of events that will be in the list when this callback is invoked. - */ - private final int maxBatchSize; - - /** - * The max time duration to wait to receive a batch of events upto the max batch size before. - * invoking this callback. - */ - private final Duration maxWaitTime; - - public BatchConsumerConfig(int maxBatchSize, Duration maxWaitTime) { - this.maxBatchSize = maxBatchSize; - this.maxWaitTime = maxWaitTime; - } - - public int getMaxBatchSize() { - return maxBatchSize; - } - - public Duration getMaxWaitTime() { - return maxWaitTime; - } - - public static BatchConsumerConfigBuilder builder() { - return new BatchConsumerConfigBuilder(); - } - - /** - * Builder class for {@link BatchConsumerConfig}. - */ - public static class BatchConsumerConfigBuilder { - private int maxBatchSize; - - private Duration maxWaitTime; - - public BatchConsumerConfigBuilder batchSize(int batchSize) { - this.maxBatchSize = batchSize; - return this; - } - - public BatchConsumerConfigBuilder maxWaitTime(Duration maxWaitTime) { - this.maxWaitTime = maxWaitTime; - return this; - } - - public BatchConsumerConfig build() { - return new BatchConsumerConfig(this.maxBatchSize, this.maxWaitTime); - } - } -} diff --git a/sdk/spring/azure-spring-integration-core/src/main/java/com/azure/spring/integration/core/api/Batchable.java b/sdk/spring/azure-spring-integration-core/src/main/java/com/azure/spring/integration/core/api/Batchable.java deleted file mode 100644 index c220bd01b3fa..000000000000 --- a/sdk/spring/azure-spring-integration-core/src/main/java/com/azure/spring/integration/core/api/Batchable.java +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.integration.core.api; - -/** - * Support Batch Consuming by setting {@link Batchable} - * - */ -public interface Batchable { - - BatchConsumerConfig getBatchConsumerConfig(); - - void setBatchConsumerConfig(BatchConsumerConfig batchConsumerConfig); - -} diff --git a/sdk/spring/azure-spring-integration-eventhubs/src/test/java/com/azure/spring/integration/eventhub/converter/EventHubBatchMessageConverterTest.java b/sdk/spring/azure-spring-integration-eventhubs/src/test/java/com/azure/spring/integration/eventhub/converter/EventHubBatchMessageConverterTest.java deleted file mode 100644 index 5e266ceb444d..000000000000 --- a/sdk/spring/azure-spring-integration-eventhubs/src/test/java/com/azure/spring/integration/eventhub/converter/EventHubBatchMessageConverterTest.java +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.integration.eventhub.converter; - -import com.azure.messaging.eventhubs.CheckpointStore; -import com.azure.messaging.eventhubs.EventData; -import com.azure.messaging.eventhubs.models.EventBatchContext; -import com.azure.messaging.eventhubs.models.LastEnqueuedEventProperties; -import com.azure.messaging.eventhubs.models.PartitionContext; -import com.azure.spring.integration.core.EventHubHeaders; -import com.azure.spring.integration.test.support.pojo.User; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.Assertions; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.springframework.integration.support.MessageBuilder; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessageHeaders; - -import java.nio.charset.StandardCharsets; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static com.azure.spring.integration.core.EventHubHeaders.BATCH_CONVERTED_APPLICATION_PROPERTIES; -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.junit.jupiter.api.Assertions.*; -import static org.springframework.messaging.support.NativeMessageHeaderAccessor.NATIVE_HEADERS; - -@SuppressWarnings("unchecked") -public class EventHubBatchMessageConverterTest { - - private static final String PARTITION_KEY = "abc"; - private static final Instant ENQUEUED_TIME = Instant.now().minus(1, ChronoUnit.DAYS); - private static final Long OFFSET = 1234567890L; - private static final Long SEQUENCE_NUMBER = 123456L; - - private final String headerProperties = "headerProperties"; - private final String payload1 = new String(new char[10000]).replace("\0", "a"); - private final String payload2 = new String(new char[10000]).replace("\0", "b"); - private final byte[] payloadBytes1 = payload1.getBytes(UTF_8); - private final byte[] payloadBytes2 = payload2.getBytes(UTF_8); - private final User payloadPojo1 = new User(payload1); - private final User payloadPojo2 = new User(payload2); - private final ObjectMapper objectMapper = new ObjectMapper(); - private final EventHubBatchMessageConverter converter = new EventHubBatchMessageConverter(); - - private final PartitionContext partitionContext = new PartitionContext("TEST_NAMESPACE", - "TEST_EVENT_HUB", "TEST_DEFAULT_GROUP", "TEST_TEST_ID"); - private final LastEnqueuedEventProperties lastEnqueuedEventProperties = new LastEnqueuedEventProperties(1035L, - 100L, Instant.ofEpochSecond(1608315301L), Instant.ofEpochSecond(1609315301L)); - private final List events = new ArrayList<>(); - - @Mock - private CheckpointStore checkpointStore; - - @BeforeEach - void beforeEach() { - MockitoAnnotations.initMocks(this); - } - - @Test - public void sendPayloadAsByte() { - EventData azureMessage = convertToEventData(payloadBytes1); - assertNotNull(azureMessage); - assertArrayEquals(azureMessage.getBody(), payloadBytes1); - assertEventDataHeadersEqual(azureMessage); - } - - @Test - public void sendPayloadAsString() { - EventData azureMessage = convertToEventData(payload1); - assertNotNull(azureMessage); - assertEquals(azureMessage.getBodyAsString(), payload1); - assertEventDataHeadersEqual(azureMessage); - } - - @Test - public void sendPayloadAsPojoClass() throws JsonProcessingException { - EventData azureMessage = convertToEventData(payloadPojo1); - assertNotNull(azureMessage); - assertArrayEquals(azureMessage.getBody(), objectMapper.writeValueAsBytes(payloadPojo1)); - assertEventDataHeadersEqual(azureMessage); - } - - @Test - public void testNonUtf8DecodingPayload() { - String utf16Payload = new String(payload1.getBytes(), StandardCharsets.UTF_16); - Message message = MessageBuilder.withPayload(utf16Payload).build(); - EventData azureMessage = converter.fromMessage(message, EventData.class); - assertEquals(utf16Payload, azureMessage.getBodyAsString()); - assertNotEquals(payload1, azureMessage.getBodyAsString()); - } - - @Test - public void testConvertCustomHeadersToEventData() { - Map headerMap = new HashMap<>(); - headerMap.put("fake-header", "fake-value"); - MessageHeaders headers = new MessageHeaders(headerMap); - - EventData eventData = new EventData(payload1); - - EventHubBatchMessageConverter converter = new EventHubBatchMessageConverter(); - converter.setCustomHeaders(headers, eventData); - - assertEquals(eventData.getProperties().get("fake-header"), "fake-value"); - assertEquals(eventData.getBodyAsString(), payload1); - } - - @Test - public void testSystemPropertiesScreenedOut() { - Map headerMap = new HashMap<>(); - headerMap.put(EventHubHeaders.PARTITION_KEY, PARTITION_KEY); - headerMap.put(EventHubHeaders.ENQUEUED_TIME, ENQUEUED_TIME); - headerMap.put(EventHubHeaders.OFFSET, OFFSET); - headerMap.put(EventHubHeaders.SEQUENCE_NUMBER, SEQUENCE_NUMBER); - MessageHeaders headers = new MessageHeaders(headerMap); - - EventData eventData = new EventData(payload1); - - EventHubBatchMessageConverter converter = new EventHubBatchMessageConverter(); - converter.setCustomHeaders(headers, eventData); - - assertFalse(eventData.getProperties().containsKey(EventHubHeaders.PARTITION_KEY)); - assertFalse(eventData.getProperties().containsKey(EventHubHeaders.ENQUEUED_TIME)); - assertFalse(eventData.getProperties().containsKey(EventHubHeaders.OFFSET)); - assertFalse(eventData.getProperties().containsKey(EventHubHeaders.SEQUENCE_NUMBER)); - } - - @Test - public void receivePayloadAsByte() throws JsonProcessingException { - setupEventDataListByPayload(payloadBytes1, payloadBytes2); - EventBatchContext eventBatchContext = new EventBatchContext(partitionContext, events, checkpointStore, - lastEnqueuedEventProperties); - Message message = this.converter.toMessage(eventBatchContext, byte[].class); - List convertedPayload = (List) message.getPayload(); - assertEventBatchPayloadEqual(convertedPayload); - } - - @Test - public void receivePayloadAsString() throws JsonProcessingException { - setupEventDataListByPayload(payload1, payload2); - EventBatchContext eventBatchContext = new EventBatchContext(partitionContext, events, checkpointStore, - lastEnqueuedEventProperties); - Message message = this.converter.toMessage(eventBatchContext, String.class); - List convertedPayload = ((List) message.getPayload()).stream().map(String::getBytes).collect(Collectors.toList()); - assertEventBatchPayloadEqual(convertedPayload); - } - - @Test - public void receivePayloadAsPojo() throws JsonProcessingException { - setupEventDataListByPayload(objectMapper.writeValueAsBytes(payloadPojo1), objectMapper.writeValueAsBytes(payloadPojo2)); - EventBatchContext eventBatchContext = new EventBatchContext(partitionContext, events, checkpointStore, - lastEnqueuedEventProperties); - Message message = this.converter.toMessage(eventBatchContext, User.class); - List convertedPayload = new ArrayList<>(); - for (User user : ((List) message.getPayload())) { - byte[] bytes = objectMapper.writeValueAsBytes(user); - convertedPayload.add(bytes); - } - assertEventBatchPayloadEqual(convertedPayload); - } - - - @Test - public void testNativeHeadersFromEventBatchContext() throws JsonProcessingException { - setupEventDataListByPayload(payloadBytes1, payloadBytes2); - String nativeHeadersString = "{\"spanId\":[\"spanId-1\", \"spanId-2\"],\"spanTraceId\":[\"spanTraceId-1\", \"spanTraceId-2\"]}"; - events.forEach(eventData -> eventData.getProperties().put(NATIVE_HEADERS, nativeHeadersString)); - EventBatchContext eventBatchContext = new EventBatchContext(partitionContext, events, checkpointStore, - lastEnqueuedEventProperties); - Map headerHeadersMap = converter.buildCustomHeaders(eventBatchContext); - assertNotNull(headerHeadersMap.get(BATCH_CONVERTED_APPLICATION_PROPERTIES)); - List> headers = (List>) headerHeadersMap.get(BATCH_CONVERTED_APPLICATION_PROPERTIES); - headers.forEach(map -> assertEquals(map.get(NATIVE_HEADERS).getClass(), String.class)); - } - - @Test - public void testEventBatchContextHeaders() throws JsonProcessingException { - setupEventDataListByPayload(payloadBytes1, payloadBytes2); - EventBatchContext eventBatchContext = new EventBatchContext(partitionContext, events, checkpointStore, - lastEnqueuedEventProperties); - Map headerHeadersMap = converter.buildCustomHeaders(eventBatchContext); - - assertTrue(headerHeadersMap.containsKey(EventHubHeaders.ENQUEUED_TIME)); - assertEquals(((List>) headerHeadersMap.get(EventHubHeaders.ENQUEUED_TIME)).size(), 2); - assertTrue(headerHeadersMap.containsKey(EventHubHeaders.OFFSET)); - assertEquals(((List>) headerHeadersMap.get(EventHubHeaders.OFFSET)).size(), 2); - assertTrue(headerHeadersMap.containsKey(EventHubHeaders.SEQUENCE_NUMBER)); - assertEquals(((List>) headerHeadersMap.get(EventHubHeaders.SEQUENCE_NUMBER)).size(), 2); - assertTrue(headerHeadersMap.containsKey(EventHubHeaders.PARTITION_KEY)); - assertEquals(((List>) headerHeadersMap.get(EventHubHeaders.PARTITION_KEY)).size(), 2); - assertTrue(headerHeadersMap.containsKey(EventHubHeaders.BATCH_CONVERTED_SYSTEM_PROPERTIES)); - assertEquals(((List>) headerHeadersMap.get(EventHubHeaders.BATCH_CONVERTED_SYSTEM_PROPERTIES)).size(), 2); - assertTrue(headerHeadersMap.containsKey(EventHubHeaders.BATCH_CONVERTED_APPLICATION_PROPERTIES)); - assertEquals(((List>) headerHeadersMap.get(EventHubHeaders.BATCH_CONVERTED_APPLICATION_PROPERTIES)).size(), 2); - - List> headers = (List>) headerHeadersMap.get(BATCH_CONVERTED_APPLICATION_PROPERTIES); - headers.forEach(map -> assertEquals(map.get(headerProperties), headerProperties)); - } - - private EventData convertToEventData(U payload) { - Message message = MessageBuilder.withPayload(payload).setHeader(headerProperties, headerProperties).build(); - EventData azureMessage = converter.fromMessage(message, EventData.class); - return azureMessage; - } - - private void assertEventDataHeadersEqual(EventData azureMessage) { - Assertions.assertNotNull(azureMessage.getSystemProperties()); - Assertions.assertNotNull(azureMessage.getBody()); - Assertions.assertNotNull(azureMessage.getProperties()); - assertEquals(azureMessage.getProperties().get(headerProperties), headerProperties); - } - - private void setupEventDataListByPayload(Object payload1, Object payload2) throws JsonProcessingException { - events.add(convertToEventData(payload1)); - events.add(convertToEventData(payload2)); - } - - private void assertEventBatchPayloadEqual(List convertedPayload) { - assertEquals(convertedPayload.size(), events.size()); - for (int i = 0; i < convertedPayload.size(); i++) { - assertArrayEquals(convertedPayload.get(i), events.get(i).getBody()); - } - } - -} diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AbstractAzureAmqpSdkProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AbstractAzureAmqpSdkProperties.java new file mode 100644 index 000000000000..f06a491209d7 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AbstractAzureAmqpSdkProperties.java @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.properties; + +import com.azure.spring.core.properties.client.AmqpClientProperties; +import com.azure.spring.core.properties.proxy.ProxyProperties; +import com.azure.spring.core.properties.retry.RetryProperties; + +/** + * Unified properties for Azure SDK clients. + */ +public abstract class AbstractAzureAmqpSdkProperties extends AbstractAzureSdkProperties { + + protected final AmqpClientProperties client = new AmqpClientProperties(); + protected final ProxyProperties proxy = new ProxyProperties(); + protected final RetryProperties retry = new RetryProperties(); + + @Override + public AmqpClientProperties getClient() { + return client; + } + + @Override + public ProxyProperties getProxy() { + return proxy; + } + + @Override + public RetryProperties getRetry() { + return retry; + } +} diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AbstractAzureHttpSdkProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AbstractAzureHttpSdkProperties.java new file mode 100644 index 000000000000..3964f307d73e --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AbstractAzureHttpSdkProperties.java @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.properties; + +import com.azure.spring.core.properties.client.HttpClientProperties; +import com.azure.spring.core.properties.proxy.HttpProxyProperties; +import com.azure.spring.core.properties.retry.HttpRetryProperties; + +/** + * Unified properties for Azure SDK clients. + */ +public abstract class AbstractAzureHttpSdkProperties extends AbstractAzureSdkProperties { + + protected final HttpClientProperties client = new HttpClientProperties(); + protected final HttpProxyProperties proxy = new HttpProxyProperties(); + protected final HttpRetryProperties retry = new HttpRetryProperties(); + + @Override + public HttpClientProperties getClient() { + return client; + } + + @Override + public HttpProxyProperties getProxy() { + return proxy; + } + + @Override + public HttpRetryProperties getRetry() { + return retry; + } +} diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AbstractAzureSdkProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AbstractAzureSdkProperties.java index 0951649b204b..d374933766d1 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AbstractAzureSdkProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AbstractAzureSdkProperties.java @@ -4,64 +4,23 @@ package com.azure.spring.core.properties; import com.azure.spring.core.properties.authentication.TokenCredentialProperties; -import com.azure.spring.core.properties.client.ClientProperties; import com.azure.spring.core.properties.profile.AzureProfile; -import com.azure.spring.core.properties.proxy.ProxyProperties; -import com.azure.spring.core.properties.retry.RetryProperties; /** * Unified properties for Azure SDK clients. */ public abstract class AbstractAzureSdkProperties implements AzureProperties { - private ClientProperties client = new ClientProperties(); - private ProxyProperties proxy = new ProxyProperties(); - private RetryProperties retry = new RetryProperties(); - private TokenCredentialProperties credential = new TokenCredentialProperties(); - private AzureProfile profile = new AzureProfile(); - - @Override - public ClientProperties getClient() { - return client; - } - - public void setClient(ClientProperties client) { - this.client = client; - } - - @Override - public ProxyProperties getProxy() { - return proxy; - } - - public void setProxy(ProxyProperties proxy) { - this.proxy = proxy; - } - - @Override - public RetryProperties getRetry() { - return retry; - } - - public void setRetry(RetryProperties retry) { - this.retry = retry; - } + protected final TokenCredentialProperties credential = new TokenCredentialProperties(); + protected final AzureProfile profile = new AzureProfile(); @Override public TokenCredentialProperties getCredential() { return credential; } - public void setCredential(TokenCredentialProperties credential) { - this.credential = credential; - } - @Override public AzureProfile getProfile() { return profile; } - - public void setProfile(AzureProfile profile) { - this.profile = profile; - } } diff --git a/sdk/spring/spring-messaging-azure-eventhubs/src/main/java/com/azure/spring/eventhubs/core/properties/CommonProperties.java b/sdk/spring/spring-messaging-azure-eventhubs/src/main/java/com/azure/spring/eventhubs/core/properties/CommonProperties.java index f7060ce6d4de..3484eb0f2372 100644 --- a/sdk/spring/spring-messaging-azure-eventhubs/src/main/java/com/azure/spring/eventhubs/core/properties/CommonProperties.java +++ b/sdk/spring/spring-messaging-azure-eventhubs/src/main/java/com/azure/spring/eventhubs/core/properties/CommonProperties.java @@ -5,13 +5,13 @@ import com.azure.spring.core.aware.authentication.ConnectionStringAware; import com.azure.spring.core.connectionstring.implementation.EventHubConnectionString; -import com.azure.spring.core.properties.AbstractAzureSdkProperties; +import com.azure.spring.core.properties.AbstractAzureAmqpSdkProperties; import com.azure.spring.service.eventhubs.properties.EventHubCommonDescriptor; /** * Common properties shared by event hub namespace, a producer, and a consumer. */ -abstract class CommonProperties extends AbstractAzureSdkProperties implements EventHubCommonDescriptor, ConnectionStringAware { +abstract class CommonProperties extends AbstractAzureAmqpSdkProperties implements EventHubCommonDescriptor, ConnectionStringAware { private String domainName = "servicebus.windows.net"; diff --git a/sdk/spring/spring-messaging-azure-eventhubs/src/test/java/com/azure/spring/eventhubs/core/properties/merger/ProcessorPropertiesParentMergerTest.java b/sdk/spring/spring-messaging-azure-eventhubs/src/test/java/com/azure/spring/eventhubs/core/properties/merger/ProcessorPropertiesParentMergerTest.java index 082b9ec89cc7..83e5ca855f07 100644 --- a/sdk/spring/spring-messaging-azure-eventhubs/src/test/java/com/azure/spring/eventhubs/core/properties/merger/ProcessorPropertiesParentMergerTest.java +++ b/sdk/spring/spring-messaging-azure-eventhubs/src/test/java/com/azure/spring/eventhubs/core/properties/merger/ProcessorPropertiesParentMergerTest.java @@ -3,7 +3,6 @@ package com.azure.spring.eventhubs.core.properties.merger; -import com.azure.spring.core.properties.proxy.ProxyProperties; import com.azure.spring.eventhubs.core.properties.NamespaceProperties; import com.azure.spring.eventhubs.core.properties.ProcessorProperties; import org.junit.jupiter.api.Assertions; @@ -20,9 +19,7 @@ void childNotProvidedShouldUseParent() { NamespaceProperties parent = new NamespaceProperties(); parent.setEventHubName("parent"); parent.setConnectionString("parent-connection-str"); - ProxyProperties proxy = new ProxyProperties(); - proxy.setHostname("parent-hostname"); - parent.setProxy(proxy); + parent.getProxy().setHostname("parent-hostname"); ProcessorProperties result = merger.mergeParent(child, parent); @@ -36,9 +33,7 @@ void childProvidedShouldUseChild() { ProcessorProperties child = new ProcessorProperties(); child.setEventHubName("child"); child.setConnectionString("child-connection-str"); - ProxyProperties proxy = new ProxyProperties(); - proxy.setHostname("child-hostname"); - child.setProxy(proxy); + child.getProxy().setHostname("child-hostname"); child.setTrackLastEnqueuedEventProperties(true); child.setPrefetchCount(3); child.setConsumerGroup("default"); @@ -46,9 +41,7 @@ void childProvidedShouldUseChild() { NamespaceProperties parent = new NamespaceProperties(); parent.setEventHubName("parent"); parent.setConnectionString("parent-connection-str"); - ProxyProperties anotherProxy = new ProxyProperties(); - anotherProxy.setHostname("parent-hostname"); - parent.setProxy(anotherProxy); + parent.getProxy().setHostname("parent-hostname"); ProcessorProperties result = merger.mergeParent(child, parent); diff --git a/sdk/spring/spring-messaging-azure-eventhubs/src/test/java/com/azure/spring/eventhubs/core/properties/merger/ProducerPropertiesParentMergerTest.java b/sdk/spring/spring-messaging-azure-eventhubs/src/test/java/com/azure/spring/eventhubs/core/properties/merger/ProducerPropertiesParentMergerTest.java index 43a3ebb23227..afb5ca2b7220 100644 --- a/sdk/spring/spring-messaging-azure-eventhubs/src/test/java/com/azure/spring/eventhubs/core/properties/merger/ProducerPropertiesParentMergerTest.java +++ b/sdk/spring/spring-messaging-azure-eventhubs/src/test/java/com/azure/spring/eventhubs/core/properties/merger/ProducerPropertiesParentMergerTest.java @@ -3,7 +3,6 @@ package com.azure.spring.eventhubs.core.properties.merger; -import com.azure.spring.core.properties.proxy.ProxyProperties; import com.azure.spring.eventhubs.core.properties.NamespaceProperties; import com.azure.spring.eventhubs.core.properties.ProducerProperties; import org.junit.jupiter.api.Assertions; @@ -20,9 +19,7 @@ void childNotProvidedShouldUseParent() { NamespaceProperties parent = new NamespaceProperties(); parent.setEventHubName("parent"); parent.setConnectionString("parent-connection-str"); - ProxyProperties proxy = new ProxyProperties(); - proxy.setHostname("parent-hostname"); - parent.setProxy(proxy); + parent.getProxy().setHostname("parent-hostname"); ProducerProperties result = merger.mergeParent(child, parent); @@ -36,16 +33,12 @@ void childProvidedShouldUseChild() { ProducerProperties child = new ProducerProperties(); child.setEventHubName("child"); child.setConnectionString("child-connection-str"); - ProxyProperties proxy = new ProxyProperties(); - proxy.setHostname("child-hostname"); - child.setProxy(proxy); + child.getProxy().setHostname("child-hostname"); NamespaceProperties parent = new NamespaceProperties(); parent.setEventHubName("parent"); parent.setConnectionString("parent-connection-str"); - ProxyProperties anotherProxy = new ProxyProperties(); - anotherProxy.setHostname("parent-hostname"); - parent.setProxy(anotherProxy); + parent.getProxy().setHostname("parent-hostname"); ProducerProperties result = merger.mergeParent(child, parent); From dab949d9724d6800ca3335ddfe2b2c532ea01db4 Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Mon, 15 Nov 2021 12:16:09 +0800 Subject: [PATCH 12/15] fix the bug profile environment is atomic --- ...zureGlobalPropertiesAutoConfiguration.java | 23 ------------------- .../core/profile/AzureProfileCP.java | 6 ++++- .../AzureStorageBlobProperties.java | 1 - .../AzureServiceConfigurationBaseTest.java | 2 +- .../spring/core/aware/AzureProfileAware.java | 6 +---- ...tractAzureServiceClientBuilderFactory.java | 6 ++--- .../core/properties/AzurePropertiesUtils.java | 2 +- .../core/properties/profile/AzureProfile.java | 5 +++- .../profile/AzureProfileAdapter.java | 7 +++--- .../properties/AzurePropertiesUtilsTest.java | 9 -------- .../EventProcessorClientBuilderFactory.java | 17 ++++++++------ .../eventhubs/EventHubBinderBatchModeIT.java | 2 +- 12 files changed, 28 insertions(+), 58 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfiguration.java index 9aef0f795abd..493e422b9c2d 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureGlobalPropertiesAutoConfiguration.java @@ -4,14 +4,9 @@ package com.azure.spring.cloud.autoconfigure.context; import com.azure.spring.cloud.autoconfigure.properties.AzureGlobalProperties; -import com.azure.spring.core.aware.AzureProfileAware; -import com.azure.spring.core.properties.AzureProperties; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.context.EnvironmentAware; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.env.Environment; @@ -49,22 +44,4 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, } } - - @Bean - public AzurePropertiesBeanPostProcessor azurePropertiesBeanPostProcessor() { - return new AzurePropertiesBeanPostProcessor(); - } - - static class AzurePropertiesBeanPostProcessor implements BeanPostProcessor { - - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - if (bean instanceof AzureProperties) { - AzureProfileAware.Profile profile = ((AzureProperties) bean).getProfile(); - profile.afterPropertiesSet(); - } - return bean; - } - - } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java index fd69bc012675..c628c3cf797a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java @@ -6,6 +6,7 @@ import com.azure.spring.core.aware.AzureProfileAware; import com.azure.spring.core.properties.profile.AzureEnvironment; import com.azure.spring.core.properties.profile.AzureProfileAdapter; +import com.azure.spring.core.properties.profile.KnownAzureEnvironment; import org.springframework.boot.context.properties.NestedConfigurationProperty; /** @@ -27,7 +28,7 @@ public class AzureProfileCP extends AzureProfileAdapter { private AzureProfileAware.CloudType cloud = AzureProfileAware.CloudType.AZURE; @NestedConfigurationProperty - private final AzureEnvironment environment = new AzureEnvironment(); + private final AzureEnvironment environment = new KnownAzureEnvironment(AzureProfileAware.CloudType.AZURE); public String getTenantId() { return tenantId; @@ -48,6 +49,9 @@ public AzureProfileAware.CloudType getCloud() { public void setCloud(AzureProfileAware.CloudType cloud) { this.cloud = cloud; + + // Explicitly call this method to merge default cloud endpoints to the environment object. + changeEnvironmentAccordingToCloud(); } public void setSubscriptionId(String subscriptionId) { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/properties/AzureStorageBlobProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/properties/AzureStorageBlobProperties.java index 584716bf5a14..3d14b63b2fd4 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/properties/AzureStorageBlobProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/blob/properties/AzureStorageBlobProperties.java @@ -23,7 +23,6 @@ public class AzureStorageBlobProperties extends AzureStorageProperties implement private String containerName; private String blobName; - // TODO (xiada): should we calculate the endpoint from the account name public String getEndpoint() { return endpoint == null ? buildEndpointFromAccountName() : endpoint; } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBaseTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBaseTest.java index 2cdb899adf09..fdb867f54023 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBaseTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AzureServiceConfigurationBaseTest.java @@ -103,9 +103,9 @@ void configureGlobalShouldApplyToAzureCosmosProperties() { @Test void configureEnvGlobalAndCosmosShouldApplyCosmos() { AzureGlobalProperties azureProperties = new AzureGlobalProperties(); + azureProperties.getProfile().setCloud(AZURE_CHINA); azureProperties.getProfile().getEnvironment().setActiveDirectoryEndpoint("abc"); azureProperties.getProfile().getEnvironment().setActiveDirectoryGraphApiVersion("v2"); - azureProperties.getProfile().setCloud(AZURE_CHINA); this.contextRunner .withBean(AzureGlobalProperties.class, () -> azureProperties) diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java index 61555d19f17c..28d7fa2656be 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java @@ -3,8 +3,6 @@ package com.azure.spring.core.aware; -import org.springframework.beans.factory.InitializingBean; - /** * Interface to be implemented by classes that wish to be aware of the Azure profile. */ @@ -15,7 +13,7 @@ public interface AzureProfileAware { /** * Interface to be implemented by classes that wish to describe an Azure cloud profile. */ - interface Profile extends InitializingBean { + interface Profile { String getTenantId(); @@ -25,8 +23,6 @@ interface Profile extends InitializingBean { Environment getEnvironment(); - @Override - void afterPropertiesSet(); } /** diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AbstractAzureServiceClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AbstractAzureServiceClientBuilderFactory.java index ab36112bdb13..439b9e447fe1 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AbstractAzureServiceClientBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AbstractAzureServiceClientBuilderFactory.java @@ -6,7 +6,6 @@ import com.azure.core.credential.TokenCredential; import com.azure.core.util.Configuration; import com.azure.identity.DefaultAzureCredentialBuilder; -import com.azure.spring.core.aware.AzureProfileAware; import com.azure.spring.core.aware.ClientAware; import com.azure.spring.core.aware.authentication.ConnectionStringAware; import com.azure.spring.core.connectionstring.ConnectionStringProvider; @@ -103,11 +102,10 @@ protected void configureApplicationId(T builder) { } protected void configureAzureEnvironment(T builder) { - AzureProfileAware.Profile profile = getAzureProperties().getProfile(); - profile.afterPropertiesSet(); Configuration configuration = new Configuration(); - configuration.put(Configuration.PROPERTY_AZURE_AUTHORITY_HOST, profile.getEnvironment().getActiveDirectoryEndpoint()); + configuration.put(Configuration.PROPERTY_AZURE_AUTHORITY_HOST, + getAzureProperties().getProfile().getEnvironment().getActiveDirectoryEndpoint()); consumeConfiguration().accept(builder, configuration); } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzurePropertiesUtils.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzurePropertiesUtils.java index 83771fbf81c3..88582a70269a 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzurePropertiesUtils.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzurePropertiesUtils.java @@ -78,7 +78,7 @@ public static void copyPropertiesWhenTargetIsNull(T source, T target) { BeanUtils.copyProperties(source, target, findNonNullPropertyNames(target)); } - private static void copyPropertiesIgnoreNull(Object source, Object target) { + public static void copyPropertiesIgnoreNull(Object source, Object target) { BeanUtils.copyProperties(source, target, findNullPropertyNames(source)); } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfile.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfile.java index a28f2cbe6ba1..f1300e25dd71 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfile.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfile.java @@ -15,7 +15,7 @@ public class AzureProfile extends AzureProfileAdapter { private String tenantId; private String subscriptionId; private AzureProfileAware.CloudType cloud = AZURE; - private final AzureEnvironment environment = new AzureEnvironment(); + private final AzureEnvironment environment = new KnownAzureEnvironment(AZURE); public String getTenantId() { return tenantId; @@ -40,6 +40,9 @@ public AzureProfileAware.CloudType getCloud() { public void setCloud(AzureProfileAware.CloudType cloud) { this.cloud = cloud; + + // Explicitly call this method to merge default cloud endpoints to the environment object. + changeEnvironmentAccordingToCloud(); } @Override diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfileAdapter.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfileAdapter.java index 7869ea716004..4d30b09db3c0 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfileAdapter.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureProfileAdapter.java @@ -9,17 +9,16 @@ import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_CHINA; import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_GERMANY; import static com.azure.spring.core.aware.AzureProfileAware.CloudType.AZURE_US_GOVERNMENT; -import static com.azure.spring.core.properties.AzurePropertiesUtils.copyPropertiesWhenTargetIsNull; +import static com.azure.spring.core.properties.AzurePropertiesUtils.copyPropertiesIgnoreNull; /** * Skeleton implementation of a {@link AzureProfileAware.Profile}. */ public abstract class AzureProfileAdapter implements AzureProfileAware.Profile { - @Override - public void afterPropertiesSet() { + protected void changeEnvironmentAccordingToCloud() { AzureEnvironment defaultEnvironment = decideAzureEnvironment(this.getCloud()); - copyPropertiesWhenTargetIsNull(defaultEnvironment, this.getEnvironment()); + copyPropertiesIgnoreNull(defaultEnvironment, this.getEnvironment()); } public abstract AzureEnvironment getEnvironment(); diff --git a/sdk/spring/spring-cloud-azure-core/src/test/java/com/azure/spring/cloud/core/properties/AzurePropertiesUtilsTest.java b/sdk/spring/spring-cloud-azure-core/src/test/java/com/azure/spring/cloud/core/properties/AzurePropertiesUtilsTest.java index c601d4a5ed92..9d2171be725a 100644 --- a/sdk/spring/spring-cloud-azure-core/src/test/java/com/azure/spring/cloud/core/properties/AzurePropertiesUtilsTest.java +++ b/sdk/spring/spring-cloud-azure-core/src/test/java/com/azure/spring/cloud/core/properties/AzurePropertiesUtilsTest.java @@ -35,7 +35,6 @@ void testCopyPropertiesToNewObjectShouldEqual() { source.proxy.setHostname("hostname-A"); source.retry.getBackoff().setDelay(Duration.ofSeconds(2)); source.credential.setClientId("client-id-A"); - source.profile.afterPropertiesSet(); final AzurePropertiesB target = new AzurePropertiesB(); AzurePropertiesUtils.copyAzureCommonProperties(source, target); @@ -59,7 +58,6 @@ void testCopyPropertiesToObjectWithSameFieldsSetShouldOverride() { source.proxy.setHostname("hostname-A"); source.retry.getBackoff().setDelay(Duration.ofSeconds(2)); source.credential.setClientId("client-id-A"); - source.profile.afterPropertiesSet(); AzurePropertiesB target = new AzurePropertiesB(); target.client.setApplicationId("application-id-B"); @@ -68,7 +66,6 @@ void testCopyPropertiesToObjectWithSameFieldsSetShouldOverride() { target.proxy.setHostname("hostname-B"); target.retry.getBackoff().setDelay(Duration.ofSeconds(4)); target.credential.setClientId("client-id-B"); - target.profile.afterPropertiesSet(); Assertions.assertEquals("application-id-B", target.client.getApplicationId()); Assertions.assertEquals(AZURE, target.profile.getCloud()); @@ -89,8 +86,6 @@ void testCopyPropertiesToObjectWithSameFieldsSetShouldOverride() { Assertions.assertEquals("client-id-A", target.credential.getClientId()); Assertions.assertEquals(AzureEnvironment.AZURE_CHINA.getActiveDirectoryEndpoint(), target.profile.getEnvironment().getActiveDirectoryEndpoint()); - - } @Test @@ -112,14 +107,12 @@ void testCopyPropertiesToObjectWithDifferentFieldsSetShouldOverrideWithNull() { void testCopyPropertiesIgnoreNullToObjectWithDifferentFieldsSetShouldMerge() { AzurePropertiesA source = new AzurePropertiesA(); source.credential.setClientId("client-id-A"); - source.getProfile().afterPropertiesSet(); AzurePropertiesB target = new AzurePropertiesB(); target.credential.setClientSecret("client-secret-B"); target.retry.getBackoff().setMaxDelay(Duration.ofSeconds(2)); target.profile.setCloud(OTHER); target.profile.getEnvironment().setActiveDirectoryEndpoint("abc"); - target.getProfile().afterPropertiesSet(); Assertions.assertEquals(AZURE, source.getProfile().getCloud()); Assertions.assertEquals(AzureEnvironment.AZURE.getActiveDirectoryEndpoint(), @@ -148,7 +141,6 @@ void testCopyPropertiesIgnoreNullToObjectWithDifferentFieldsSetShouldMerge() { void testCopyPropertiesSourceNotChanged() { AzurePropertiesA source = new AzurePropertiesA(); source.credential.setClientId("client-id-A"); - source.getProfile().afterPropertiesSet(); AzurePropertiesB target = new AzurePropertiesB(); @@ -160,7 +152,6 @@ void testCopyPropertiesSourceNotChanged() { target.retry.getBackoff().setDelay(Duration.ofSeconds(2)); target.profile.setCloud(OTHER); target.profile.getEnvironment().setActiveDirectoryEndpoint("abc"); - target.getProfile().afterPropertiesSet(); Assertions.assertNull(source.retry.getBackoff().getDelay()); Assertions.assertEquals(AzureEnvironment.AZURE.getActiveDirectoryEndpoint(), diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/eventhubs/factory/EventProcessorClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/eventhubs/factory/EventProcessorClientBuilderFactory.java index 62666c71024f..6b0a8347adc1 100644 --- a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/eventhubs/factory/EventProcessorClientBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/eventhubs/factory/EventProcessorClientBuilderFactory.java @@ -24,6 +24,7 @@ import com.azure.spring.service.eventhubs.processor.EventProcessingListener; import com.azure.spring.service.eventhubs.processor.RecordEventProcessingListener; import com.azure.spring.service.eventhubs.properties.EventHubProcessorDescriptor; +import org.springframework.util.CollectionUtils; import java.util.Arrays; import java.util.List; @@ -92,13 +93,15 @@ protected void configureService(EventProcessorClientBuilder builder) { map.from(processorProperties.getLoadBalancing().getStrategy()).to(builder::loadBalancingStrategy); map.from(processorProperties.getLoadBalancing().getUpdateInterval()).to(builder::loadBalancingUpdateInterval); - map.from(processorProperties.getInitialPartitionEventPosition()).to(p -> { - Map positions = p.entrySet() - .stream() - .collect(Collectors.toMap(Map.Entry::getKey, - e -> e.getValue().toEventPosition())); - builder.initialPartitionEventPosition(positions); - }); + map.from(processorProperties.getInitialPartitionEventPosition()) + .when(c -> !CollectionUtils.isEmpty(c)) + .to(p -> { + Map positions = p.entrySet() + .stream() + .collect(Collectors.toMap(Map.Entry::getKey, + e -> e.getValue().toEventPosition())); + builder.initialPartitionEventPosition(positions); + }); configureCheckpointStore(builder); configureProcessorListener(builder); diff --git a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/src/test/java/com/azure/spring/cloud/stream/binder/eventhubs/EventHubBinderBatchModeIT.java b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/src/test/java/com/azure/spring/cloud/stream/binder/eventhubs/EventHubBinderBatchModeIT.java index bfa3dea66725..efd8e4dd004b 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/src/test/java/com/azure/spring/cloud/stream/binder/eventhubs/EventHubBinderBatchModeIT.java +++ b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/src/test/java/com/azure/spring/cloud/stream/binder/eventhubs/EventHubBinderBatchModeIT.java @@ -75,7 +75,7 @@ public void testSendAndReceiveMessage() throws InterruptedException { EventHubBinderBatchModeIT.LATCH.await(15, TimeUnit.SECONDS); LOGGER.info("Send a message:" + MESSAGE + "."); many.emitNext(new GenericMessage<>(MESSAGE), Sinks.EmitFailureHandler.FAIL_FAST); - assertThat(EventHubBinderBatchModeIT.LATCH.await(30, TimeUnit.SECONDS)).isTrue(); + assertThat(EventHubBinderBatchModeIT.LATCH.await(600, TimeUnit.SECONDS)).isTrue(); LOGGER.info("EventHubBinderBatchModeIT end."); } } From ca513d993ff89cc5497591f99b5a6f69a7db050f Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Mon, 15 Nov 2021 14:41:09 +0800 Subject: [PATCH 13/15] fix ci --- .../EventProcessorClientBuilderFactory.java | 17 ++++++++--------- .../src/test/resources/application.yaml | 14 +++++++------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/eventhubs/factory/EventProcessorClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/eventhubs/factory/EventProcessorClientBuilderFactory.java index 6b0a8347adc1..7cd8cdc709e9 100644 --- a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/eventhubs/factory/EventProcessorClientBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/eventhubs/factory/EventProcessorClientBuilderFactory.java @@ -93,15 +93,14 @@ protected void configureService(EventProcessorClientBuilder builder) { map.from(processorProperties.getLoadBalancing().getStrategy()).to(builder::loadBalancingStrategy); map.from(processorProperties.getLoadBalancing().getUpdateInterval()).to(builder::loadBalancingUpdateInterval); - map.from(processorProperties.getInitialPartitionEventPosition()) - .when(c -> !CollectionUtils.isEmpty(c)) - .to(p -> { - Map positions = p.entrySet() - .stream() - .collect(Collectors.toMap(Map.Entry::getKey, - e -> e.getValue().toEventPosition())); - builder.initialPartitionEventPosition(positions); - }); + map.from(processorProperties.getInitialPartitionEventPosition()).when(c -> !CollectionUtils.isEmpty(c)).to( + p -> { + Map positions = p.entrySet() + .stream() + .collect(Collectors.toMap(Map.Entry::getKey, + e -> e.getValue().toEventPosition())); + builder.initialPartitionEventPosition(positions); + }); configureCheckpointStore(builder); configureProcessorListener(builder); diff --git a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/src/test/resources/application.yaml b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/src/test/resources/application.yaml index dbdade083599..22c66d748361 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/src/test/resources/application.yaml +++ b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/src/test/resources/application.yaml @@ -2,11 +2,11 @@ spring: cloud: azure: eventhubs: - connection-string: ${EVENTHUB_CONNECTION_STRING_TEST_EVENTHUB} + connection-string: Endpoint=sb://liujiali-ns1.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=56BaVkqHErElUtF1PCDXebRS7FkDFgOxD+OkfEX0yfo= processor: checkpoint-store: - account-name: ${STORAGE_ACCOUNT_TEST_EVENTHUB} - account-key: ${STORAGE_ACCOUNT_KEY_TEST_EVENTHUB} + account-name: liujialian + account-key: mUIy0lNZ7/KPcwhqjD9pfcNtuv6vRZmRdoznOz50CCo858dcpfHGWGPYKkjUAVPcMsD/+tRhkSx0hQkpKgoCWg== stream: function: definition: consume;supply @@ -20,8 +20,8 @@ logging: level: com.azure: core: - amqp: WARN + amqp: INFO messaging: - servicebus: WARN - eventhubs: WARN - identity: WARN + servicebus: INFO + eventhubs: INFO + identity: INFO From f26765de12917afa3f62530fa0319d9d75a76c17 Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Mon, 15 Nov 2021 14:44:45 +0800 Subject: [PATCH 14/15] revert changes --- .../eventhubs/AzureBlobCheckpointStoreConfiguration.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/AzureBlobCheckpointStoreConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/AzureBlobCheckpointStoreConfiguration.java index 673a97dbd5bc..7e42ad661dbe 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/AzureBlobCheckpointStoreConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/AzureBlobCheckpointStoreConfiguration.java @@ -51,9 +51,8 @@ public BlobCheckpointStore blobCheckpointStore( return new BlobCheckpointStore(blobContainerAsyncClient); } - // TODO (xiada): should we remove this initializer by default -// @Bean -// @ConditionalOnMissingBean + @Bean + @ConditionalOnMissingBean public BlobCheckpointStoreContainerInitializer blobCheckpointStoreContainerInitializer() { return containerAsyncClient -> { if (Boolean.FALSE.equals(containerAsyncClient.exists().block(Duration.ofSeconds(3)))) { From d2effe865d6c2d047f8360d15cbdb530d89b84c9 Mon Sep 17 00:00:00 2001 From: Xiaolu Dai Date: Mon, 15 Nov 2021 14:48:00 +0800 Subject: [PATCH 15/15] revert changes --- .../src/test/resources/application.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/src/test/resources/application.yaml b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/src/test/resources/application.yaml index 22c66d748361..dbdade083599 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/src/test/resources/application.yaml +++ b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/src/test/resources/application.yaml @@ -2,11 +2,11 @@ spring: cloud: azure: eventhubs: - connection-string: Endpoint=sb://liujiali-ns1.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=56BaVkqHErElUtF1PCDXebRS7FkDFgOxD+OkfEX0yfo= + connection-string: ${EVENTHUB_CONNECTION_STRING_TEST_EVENTHUB} processor: checkpoint-store: - account-name: liujialian - account-key: mUIy0lNZ7/KPcwhqjD9pfcNtuv6vRZmRdoznOz50CCo858dcpfHGWGPYKkjUAVPcMsD/+tRhkSx0hQkpKgoCWg== + account-name: ${STORAGE_ACCOUNT_TEST_EVENTHUB} + account-key: ${STORAGE_ACCOUNT_KEY_TEST_EVENTHUB} stream: function: definition: consume;supply @@ -20,8 +20,8 @@ logging: level: com.azure: core: - amqp: INFO + amqp: WARN messaging: - servicebus: INFO - eventhubs: INFO - identity: INFO + servicebus: WARN + eventhubs: WARN + identity: WARN