diff --git a/sdk/spring/azure-spring-boot-test-keyvault/src/test/java/com/azure/spring/test/keyvault/KeyVaultSecretValueIT.java b/sdk/spring/azure-spring-boot-test-keyvault/src/test/java/com/azure/spring/test/keyvault/KeyVaultSecretValueIT.java index bf8d683128e6..714928af3996 100644 --- a/sdk/spring/azure-spring-boot-test-keyvault/src/test/java/com/azure/spring/test/keyvault/KeyVaultSecretValueIT.java +++ b/sdk/spring/azure-spring-boot-test-keyvault/src/test/java/com/azure/spring/test/keyvault/KeyVaultSecretValueIT.java @@ -75,7 +75,6 @@ private static TokenCredential credentials() { public void keyVaultAsPropertySource() { LOGGER.info("keyVaultAsPropertySource begin."); try (AppRunner app = new AppRunner(DummyApp.class)) { - app.property("spring.cloud.azure.keyvault.secret.enabled", "false"); app.property("spring.cloud.azure.keyvault.secret.property-source-enabled", "true"); app.property("spring.cloud.azure.keyvault.secret.endpoint", AZURE_KEYVAULT_URI); app.property("spring.cloud.azure.keyvault.secret.credential.client-id", SPRING_CLIENT_ID); @@ -99,7 +98,6 @@ public void keyVaultAsPropertySource() { public void keyVaultAsPropertySourceWithSpecificKeys() { LOGGER.info("keyVaultAsPropertySourceWithSpecificKeys begin."); try (AppRunner app = new AppRunner(DummyApp.class)) { - app.property("spring.cloud.azure.keyvault.secret.enabled", "false"); app.property("spring.cloud.azure.keyvault.secret.property-source-enabled", "true"); app.property("spring.cloud.azure.keyvault.secret.endpoint", AZURE_KEYVAULT_URI); app.property("spring.cloud.azure.keyvault.secret.credential.client-id", SPRING_CLIENT_ID); 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/AzureAppConfigurationProperties.java index d47ca64d2b4f..43a488bb5a44 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/AzureAppConfigurationProperties.java @@ -4,13 +4,13 @@ package com.azure.spring.cloud.autoconfigure.appconfiguration; import com.azure.data.appconfiguration.ConfigurationServiceVersion; -import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureHttpConfigurationProperties; +import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureHttpCP; import com.azure.spring.service.appconfiguration.AppConfigurationProperties; /** * Properties for Azure App Configuration. */ -public class AzureAppConfigurationProperties extends AbstractAzureHttpConfigurationProperties +public class AzureAppConfigurationProperties extends AbstractAzureHttpCP implements AppConfigurationProperties { public static final String PREFIX = "spring.cloud.azure.appconfiguration"; 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/AzureCosmosProperties.java index ae0277c6d34d..a0ba63b51990 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/AzureCosmosProperties.java @@ -9,10 +9,10 @@ import com.azure.cosmos.GatewayConnectionConfig; import com.azure.cosmos.ThrottlingRetryOptions; import com.azure.cosmos.models.CosmosPermissionProperties; -import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureServiceConfigurationProperties; +import com.azure.spring.cloud.autoconfigure.properties.core.AbstractAzureServiceCP; import com.azure.spring.core.properties.client.ClientProperties; -import com.azure.spring.service.cosmos.CosmosProperties; import com.azure.spring.core.properties.proxy.HttpProxyProperties; +import com.azure.spring.service.cosmos.CosmosProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.validation.annotation.Validated; @@ -25,13 +25,16 @@ * Configuration properties for Cosmos database, consistency, telemetry, connection, query metrics and diagnostics. */ @Validated -public class AzureCosmosProperties extends AbstractAzureServiceConfigurationProperties implements CosmosProperties { +public class AzureCosmosProperties extends AbstractAzureServiceCP implements CosmosProperties { public static final String PREFIX = "spring.cloud.azure.cosmos"; @NestedConfigurationProperty private final HttpProxyProperties proxy = new HttpProxyProperties(); + @NestedConfigurationProperty + private final ClientProperties client = new ClientProperties(); + @NotEmpty @Pattern(regexp = "http[s]{0,1}://.*.documents.azure.com.*") private String endpoint; @@ -76,7 +79,7 @@ public HttpProxyProperties getProxy() { @Override public ClientProperties getClient() { - return new ClientProperties(); + return client; } public String getEndpoint() { @@ -92,7 +95,6 @@ public String getKey() { return key; } - @Override public void setKey(String key) { this.key = key; } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/properties/AzureEventHubCommonProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/properties/AzureEventHubCommonProperties.java index addbe90ba2e6..2b0aa0519f4a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/properties/AzureEventHubCommonProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhubs/properties/AzureEventHubCommonProperties.java @@ -3,13 +3,13 @@ package com.azure.spring.cloud.autoconfigure.eventhubs.properties; -import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureAmqpConfigurationProperties; +import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureAmqpCP; import com.azure.spring.core.connectionstring.implementation.EventHubConnectionString; /** * Azure Event Hub related properties. */ -public abstract class AzureEventHubCommonProperties extends AbstractAzureAmqpConfigurationProperties { +public abstract class AzureEventHubCommonProperties extends AbstractAzureAmqpCP { protected String domainName = "servicebus.windows.net"; protected String namespace; 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/AzureKeyVaultProperties.java index 12ce2cbcda13..e2cbb27aa0d9 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/AzureKeyVaultProperties.java @@ -3,12 +3,12 @@ package com.azure.spring.cloud.autoconfigure.keyvault; -import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureHttpConfigurationProperties; +import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureHttpCP; /** * Common properties for Azure Key Vault */ -public class AzureKeyVaultProperties extends AbstractAzureHttpConfigurationProperties { +public class AzureKeyVaultProperties extends AbstractAzureHttpCP { // TODO (xiada): the default vault url private String endpoint; 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 3a518786579a..338ed0409b77 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 @@ -77,7 +77,7 @@ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringAp addKeyVaultPropertySource(environment, properties); } } else { - logger.debug("Key Vault property source is not enabled"); + logger.debug("Key Vault 'propertySourceEnabled' or 'enabled' is not enabled"); } } @@ -170,8 +170,8 @@ private AzureKeyVaultSecretProperties loadProperties(Binder binder) { * @return true if the key vault is enabled, false otherwise. */ private boolean isKeyVaultPropertySourceEnabled(AzureKeyVaultSecretProperties properties) { - return Boolean.TRUE.equals(properties.getPropertySourceEnabled()) - || !properties.getPropertySources().isEmpty(); + return (Boolean.TRUE.equals(properties.getPropertySourceEnabled()) || !properties.getPropertySources().isEmpty()) + && Boolean.TRUE.equals(properties.isEnabled()); } private boolean isKeyVaultClientAvailable() { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultPropertySourceProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultPropertySourceProperties.java index 67a54483159a..d6f7959c2ffa 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultPropertySourceProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/keyvault/secrets/AzureKeyVaultPropertySourceProperties.java @@ -4,7 +4,7 @@ package com.azure.spring.cloud.autoconfigure.keyvault.secrets; import com.azure.security.keyvault.secrets.SecretServiceVersion; -import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureHttpConfigurationProperties; +import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureHttpCP; import java.time.Duration; import java.util.List; @@ -14,7 +14,7 @@ /** * Configurations to set when Azure Key Vault is used as an external property source. */ -public class AzureKeyVaultPropertySourceProperties extends AbstractAzureHttpConfigurationProperties { +public class AzureKeyVaultPropertySourceProperties extends AbstractAzureHttpCP { public static final Duration DEFAULT_REFRESH_INTERVAL = Duration.ofMinutes(30); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureAmqpCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureAmqpCP.java new file mode 100644 index 000000000000..41b53f38f092 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureAmqpCP.java @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.properties; + +import com.azure.spring.cloud.autoconfigure.properties.core.AbstractAzureServiceCP; +import com.azure.spring.cloud.autoconfigure.properties.core.client.AmqpClientCP; +import com.azure.spring.cloud.autoconfigure.properties.core.proxy.ProxyCP; +import com.azure.spring.cloud.autoconfigure.properties.core.retry.RetryCP; +import org.springframework.boot.context.properties.NestedConfigurationProperty; + +/** + * + */ +public abstract class AbstractAzureAmqpCP extends AbstractAzureServiceCP { + + @NestedConfigurationProperty + protected final AmqpClientCP client = new AmqpClientCP(); + + @NestedConfigurationProperty + protected final RetryCP retry = new RetryCP(); + + @NestedConfigurationProperty + protected final ProxyCP proxy = new ProxyCP(); + + @Override + public AmqpClientCP getClient() { + return client; + } + + @Override + public RetryCP getRetry() { + return retry; + } + + @Override + public ProxyCP getProxy() { + return proxy; + } +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureAmqpConfigurationProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureAmqpConfigurationProperties.java deleted file mode 100644 index 4c76dc5fcd64..000000000000 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureAmqpConfigurationProperties.java +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.cloud.autoconfigure.properties; - -import com.azure.spring.core.properties.proxy.ProxyProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; - -/** - * - */ -public abstract class AbstractAzureAmqpConfigurationProperties extends AbstractAzureServiceConfigurationProperties { - - @NestedConfigurationProperty - protected final AmqpClientConfigurationProperties client = new AmqpClientConfigurationProperties(); - - @NestedConfigurationProperty - protected final ProxyProperties proxy = new ProxyProperties(); - - @Override - public AmqpClientConfigurationProperties getClient() { - return client; - } - - @Override - public ProxyProperties getProxy() { - return proxy; - } -} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureHttpCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureHttpCP.java new file mode 100644 index 000000000000..aaefe4df2222 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureHttpCP.java @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.properties; + +import com.azure.spring.cloud.autoconfigure.properties.core.AbstractAzureServiceCP; +import com.azure.spring.cloud.autoconfigure.properties.core.client.HttpClientCP; +import com.azure.spring.cloud.autoconfigure.properties.core.proxy.HttpProxyCP; +import com.azure.spring.cloud.autoconfigure.properties.core.retry.HttpRetryCP; +import org.springframework.boot.context.properties.NestedConfigurationProperty; + +/** + * Configuration properties base class for all Azure Http clients. + */ +public abstract class AbstractAzureHttpCP extends AbstractAzureServiceCP { + + @NestedConfigurationProperty + protected final HttpClientCP client = new HttpClientCP(); + + @NestedConfigurationProperty + protected final HttpProxyCP proxy = new HttpProxyCP(); + + @NestedConfigurationProperty + protected final HttpRetryCP retry = new HttpRetryCP(); + + @Override + public HttpClientCP getClient() { + return client; + } + + @Override + public HttpProxyCP getProxy() { + return proxy; + } + + @Override + public HttpRetryCP getRetry() { + return retry; + } +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureHttpConfigurationProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureHttpConfigurationProperties.java deleted file mode 100644 index 1f3e1cba45e0..000000000000 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureHttpConfigurationProperties.java +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.cloud.autoconfigure.properties; - -import com.azure.spring.core.properties.proxy.HttpProxyProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; - -/** - * Configuration properties base class for all Azure Http clients. - */ -public abstract class AbstractAzureHttpConfigurationProperties extends AbstractAzureServiceConfigurationProperties { - - @NestedConfigurationProperty - protected final HttpClientConfigurationProperties client = new HttpClientConfigurationProperties(); - - @NestedConfigurationProperty - protected final HttpProxyProperties proxy = new HttpProxyProperties(); - - @Override - public HttpClientConfigurationProperties getClient() { - return client; - } - - @Override - public HttpProxyProperties getProxy() { - return proxy; - } -} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AmqpClientConfigurationProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AmqpClientConfigurationProperties.java deleted file mode 100644 index 583c0507ff19..000000000000 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AmqpClientConfigurationProperties.java +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.cloud.autoconfigure.properties; - -import com.azure.spring.core.properties.client.AmqpClientProperties; -import com.azure.spring.core.properties.client.ClientProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; - -/** - * This class is only for configuration-processor to find the sub-namespace of logging. The {@link LoggingProperties} is - * defined as static inner class in {@link ClientProperties} and {@link AmqpClientProperties} extends the - * {@link ClientProperties}, so when the processor process the {@link AmqpClientProperties} class it will skip the - * logging field for it's an external class. - */ -public class AmqpClientConfigurationProperties extends AmqpClientProperties { - - @NestedConfigurationProperty - private final LoggingProperties logging = new LoggingProperties(); - - @Override - public LoggingProperties getLogging() { - return logging; - } -} 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 62ccab1edbff..0f1532ce6e97 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,12 +3,12 @@ package com.azure.spring.cloud.autoconfigure.properties; +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.ClientProperties; -import com.azure.spring.core.properties.credential.TokenCredentialProperties; -import com.azure.spring.core.properties.profile.AzureProfile; -import com.azure.spring.core.properties.proxy.ProxyProperties; -import com.azure.spring.core.properties.retry.RetryProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; @@ -23,42 +23,42 @@ public class AzureGlobalProperties implements AzureProperties { public static final String PREFIX = "spring.cloud.azure"; @NestedConfigurationProperty - protected final ClientProperties client = new ClientProperties(); + protected final ClientCP client = new ClientCP(); @NestedConfigurationProperty - protected final ProxyProperties proxy = new ProxyProperties(); + protected final ProxyCP proxy = new ProxyCP(); @NestedConfigurationProperty - protected final RetryProperties retry = new RetryProperties(); + protected final RetryCP retry = new RetryCP(); @NestedConfigurationProperty - protected final TokenCredentialProperties credential = new TokenCredentialProperties(); + protected final TokenCredentialCP credential = new TokenCredentialCP(); @NestedConfigurationProperty - protected final AzureProfile profile = new AzureProfile(); + protected final AzureProfileCP profile = new AzureProfileCP(); @Override - public ClientProperties getClient() { + public ClientCP getClient() { return client; } @Override - public ProxyProperties getProxy() { + public ProxyCP getProxy() { return proxy; } @Override - public RetryProperties getRetry() { + public RetryCP getRetry() { return retry; } @Override - public TokenCredentialProperties getCredential() { + public TokenCredentialCP getCredential() { return credential; } @Override - public AzureProfile getProfile() { + public AzureProfileCP getProfile() { return profile; } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/HttpClientConfigurationProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/HttpClientConfigurationProperties.java deleted file mode 100644 index 5b5d54aaa847..000000000000 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/HttpClientConfigurationProperties.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.cloud.autoconfigure.properties; - -import com.azure.spring.core.properties.client.ClientProperties; -import com.azure.spring.core.properties.client.HttpClientProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; - -/** - * This class is only for configuration-processor to find the sub-namespace of logging. The {@link LoggingProperties} is - * defined as static inner class in {@link ClientProperties} and {@link HttpClientProperties} extends the - * {@link ClientProperties}, so when the processor process the {@link HttpClientProperties} class it will skip the - * logging field for it's an external class. - */ -public class HttpClientConfigurationProperties extends HttpClientProperties { - - @NestedConfigurationProperty - private final LoggingProperties logging = new LoggingProperties(); - - @Override - public LoggingProperties getLogging() { - return logging; - } - -} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureServiceConfigurationProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/AbstractAzureServiceCP.java similarity index 54% rename from sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureServiceConfigurationProperties.java rename to sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/AbstractAzureServiceCP.java index 9955990ff02f..693893c9a9cb 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/AbstractAzureServiceConfigurationProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/AbstractAzureServiceCP.java @@ -1,30 +1,26 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.autoconfigure.properties; +package com.azure.spring.cloud.autoconfigure.properties.core; +import com.azure.spring.cloud.autoconfigure.properties.core.authentication.TokenCredentialCP; +import com.azure.spring.cloud.autoconfigure.properties.core.profile.AzureProfileCP; import com.azure.spring.core.properties.AzureProperties; -import com.azure.spring.core.properties.credential.TokenCredentialProperties; -import com.azure.spring.core.properties.profile.AzureProfile; import com.azure.spring.core.properties.resource.AzureResourceMetadata; -import com.azure.spring.core.properties.retry.RetryProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; /** * Configuration properties base class for all Azure clients. */ -public abstract class AbstractAzureServiceConfigurationProperties implements AzureProperties { +public abstract class AbstractAzureServiceCP implements AzureProperties { protected boolean enabled = true; @NestedConfigurationProperty - protected final RetryProperties retry = new RetryProperties(); + protected final TokenCredentialCP credential = new TokenCredentialCP(); @NestedConfigurationProperty - protected final TokenCredentialProperties credential = new TokenCredentialProperties(); - - @NestedConfigurationProperty - protected final AzureProfile profile = new AzureProfile(); + protected final AzureProfileCP profile = new AzureProfileCP(); @NestedConfigurationProperty protected final AzureResourceMetadata resource = new AzureResourceMetadata(); @@ -38,22 +34,16 @@ public void setEnabled(boolean enabled) { } @Override - public RetryProperties getRetry() { - return retry; - } - - @Override - public TokenCredentialProperties getCredential() { + public TokenCredentialCP getCredential() { return credential; } @Override - public AzureProfile getProfile() { + public AzureProfileCP getProfile() { return profile; } public AzureResourceMetadata getResource() { return resource; } - } 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 new file mode 100644 index 000000000000..f49767426680 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/authentication/TokenCredentialCP.java @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.properties.core.authentication; + + +import com.azure.spring.core.properties.authentication.TokenCredentialProperties; + +/** + * Azure properties used for getting token credential. + */ +public class TokenCredentialCP extends TokenCredentialProperties { + +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/AmqpClientCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/AmqpClientCP.java new file mode 100644 index 000000000000..a832cdfd4af1 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/AmqpClientCP.java @@ -0,0 +1,24 @@ +// 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.amqp.AmqpTransportType; +import com.azure.spring.core.aware.ClientAware; + +/** + * + */ +public class AmqpClientCP extends ClientCP implements ClientAware.AmqpClient { + + private AmqpTransportType transportType = AmqpTransportType.AMQP; + + @Override + 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 new file mode 100644 index 000000000000..9988fd6669c3 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/ClientCP.java @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.properties.core.client; + +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; + +/** + * + */ +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() { + return applicationId; + } + + public void setApplicationId(String applicationId) { + this.applicationId = applicationId; + } + + @Override + 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 new file mode 100644 index 000000000000..9ecf1d5575e5 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/client/HttpClientCP.java @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.properties.core.client; + +import com.azure.spring.core.aware.ClientAware; + +import java.time.Duration; + +/** + * + */ +public class HttpClientCP extends ClientCP implements ClientAware.HttpClient { + + private Duration writeTimeout; + private Duration responseTimeout; + private Duration readTimeout; + + @Override + public Duration getWriteTimeout() { + return writeTimeout; + } + + public void setWriteTimeout(Duration writeTimeout) { + this.writeTimeout = writeTimeout; + } + + @Override + public Duration getResponseTimeout() { + return responseTimeout; + } + + public void setResponseTimeout(Duration responseTimeout) { + this.responseTimeout = responseTimeout; + } + + @Override + public Duration getReadTimeout() { + return readTimeout; + } + + public void setReadTimeout(Duration readTimeout) { + this.readTimeout = readTimeout; + } +} 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 new file mode 100644 index 000000000000..9f228f3f5e8e --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/profile/AzureProfileCP.java @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.properties.core.profile; + +import com.azure.spring.core.aware.AzureProfileAware; +import com.azure.spring.core.properties.profile.AzureEnvironment; +import org.springframework.boot.context.properties.NestedConfigurationProperty; + +/** + * The AzureProfile defines the properties related to an Azure subscription. + */ +public class AzureProfileCP implements AzureProfileAware.Profile { + + private String tenantId; + private String subscriptionId; + private String cloud = "Azure"; // TODO (xiada) this name + @NestedConfigurationProperty + private AzureEnvironment environment = AzureEnvironment.AZURE; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getSubscriptionId() { + return subscriptionId; + } + + public void setSubscriptionId(String subscriptionId) { + this.subscriptionId = subscriptionId; + } + + public String getCloud() { + return cloud; + } + + public void setCloud(String cloud) { + this.cloud = cloud; + this.environment = AzureEnvironment.fromAzureCloud(cloud); + } + + public AzureEnvironment getEnvironment() { + return environment; + } + +} 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 new file mode 100644 index 000000000000..de85405500c2 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/proxy/HttpProxyCP.java @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.properties.core.proxy; + +import com.azure.spring.core.properties.proxy.HttpProxyProperties; + +/** + * HTTP-based proxy properties for all Azure HTTP SDKs. + */ +public class HttpProxyCP extends HttpProxyProperties { + +} 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 new file mode 100644 index 000000000000..a872ab640471 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/proxy/ProxyCP.java @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.properties.core.proxy; + +import com.azure.spring.core.properties.proxy.ProxyProperties; + +/** + * Common proxy properties for all Azure SDKs. + */ +public class ProxyCP extends ProxyProperties { + +} 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 new file mode 100644 index 000000000000..76a1284ece25 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/HttpRetryCP.java @@ -0,0 +1,74 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +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 { + + private final Backoff backoff = new Backoff(); + /** + * The maximum number of attempts + */ + private Integer maxAttempts; + /** + * How long to wait until a timeout + */ + 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; + } + + public void setRetryAfterHeader(String retryAfterHeader) { + this.retryAfterHeader = retryAfterHeader; + } + + @Override + public ChronoUnit getRetryAfterTimeUnit() { + return retryAfterTimeUnit; + } + + 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 new file mode 100644 index 000000000000..24e0b13fe6f3 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/properties/core/retry/RetryCP.java @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +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; + +/** + * Http based client related retry properties. + */ +public class RetryCP implements RetryAware.Retry { + + private final Backoff backoff = new Backoff(); + /** + * The maximum number of attempts + */ + private Integer maxAttempts; + /** + * How long to wait until a timeout + */ + private Duration timeout; + + public Backoff getBackoff() { + return backoff; + } + + public Integer getMaxAttempts() { + return maxAttempts; + } + + public void setMaxAttempts(Integer maxAttempts) { + this.maxAttempts = maxAttempts; + } + + public Duration getTimeout() { + return timeout; + } + + public void setTimeout(Duration timeout) { + this.timeout = timeout; + } + + /** + * Backoff properties when a retry fails. + */ + public static class Backoff extends BackoffProperties { + + } +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/properties/AzureServiceBusCommonProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/properties/AzureServiceBusCommonProperties.java index 81124ec0999f..e7536da4414f 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/properties/AzureServiceBusCommonProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/properties/AzureServiceBusCommonProperties.java @@ -3,12 +3,12 @@ package com.azure.spring.cloud.autoconfigure.servicebus.properties; -import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureAmqpConfigurationProperties; +import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureAmqpCP; /** * */ -public abstract class AzureServiceBusCommonProperties extends AbstractAzureAmqpConfigurationProperties { +public abstract class AzureServiceBusCommonProperties extends AbstractAzureAmqpCP { // https://help.boomi.com/bundle/connectors/page/r-atm-Microsoft_Azure_Service_Bus_connection.html // https://docs.microsoft.com/en-us/rest/api/servicebus/addressing-and-protocol diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/common/AzureStorageProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/common/AzureStorageProperties.java index 6560832963f4..f57b7dbfa836 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/common/AzureStorageProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/common/AzureStorageProperties.java @@ -3,13 +3,16 @@ package com.azure.spring.cloud.autoconfigure.storage.common; -import com.azure.spring.cloud.autoconfigure.properties.AbstractAzureHttpConfigurationProperties; +import com.azure.spring.cloud.autoconfigure.properties.core.AbstractAzureServiceCP; +import com.azure.spring.cloud.autoconfigure.properties.core.client.HttpClientCP; +import com.azure.spring.cloud.autoconfigure.properties.core.proxy.HttpProxyCP; import com.azure.spring.service.storage.common.StorageProperties; +import org.springframework.boot.context.properties.NestedConfigurationProperty; /** * Common properties for all Azure Storage services. */ -public class AzureStorageProperties extends AbstractAzureHttpConfigurationProperties implements StorageProperties { +public class AzureStorageProperties extends AbstractAzureServiceCP implements StorageProperties { protected String endpoint; @@ -21,6 +24,30 @@ public class AzureStorageProperties extends AbstractAzureHttpConfigurationProper protected String accountName; + @NestedConfigurationProperty + protected final StorageRetryCP retry = new StorageRetryCP(); + + @NestedConfigurationProperty + protected final HttpClientCP client = new HttpClientCP(); + + @NestedConfigurationProperty + protected final HttpProxyCP proxy = new HttpProxyCP(); + + @Override + public StorageRetryCP getRetry() { + return retry; + } + + @Override + public HttpClientCP getClient() { + return client; + } + + @Override + public HttpProxyCP getProxy() { + return proxy; + } + public String getEndpoint() { return endpoint; } @@ -50,7 +77,6 @@ public String getSasToken() { return sasToken; } - @Override public void setSasToken(String sasToken) { this.sasToken = sasToken; } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/common/StorageRetryCP.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/common/StorageRetryCP.java new file mode 100644 index 000000000000..f74d4a217f94 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/storage/common/StorageRetryCP.java @@ -0,0 +1,82 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.storage.common; + +import com.azure.spring.core.properties.retry.BackoffProperties; +import com.azure.spring.service.storage.common.StorageRetry; +import org.springframework.boot.context.properties.NestedConfigurationProperty; + +import java.time.Duration; +import java.time.temporal.ChronoUnit; + +/** + * + */ +public class StorageRetryCP implements StorageRetry { + + /** + * The maximum number of attempts + */ + private Integer maxAttempts; + /** + * How long to wait until a timeout + */ + private Duration timeout; + private String retryAfterHeader; + private ChronoUnit retryAfterTimeUnit; + private String secondaryHost; + + @NestedConfigurationProperty + private final BackoffProperties backoff = new BackoffProperties(); + + @Override + public Integer getMaxAttempts() { + return maxAttempts; + } + + @Override + public String getSecondaryHost() { + return secondaryHost; + } + + 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; + } + + public void setRetryAfterHeader(String retryAfterHeader) { + this.retryAfterHeader = retryAfterHeader; + } + + @Override + public ChronoUnit getRetryAfterTimeUnit() { + return retryAfterTimeUnit; + } + + public void setRetryAfterTimeUnit(ChronoUnit retryAfterTimeUnit) { + this.retryAfterTimeUnit = retryAfterTimeUnit; + } + + @Override + public BackoffProperties getBackoff() { + return backoff; + } + + public void setSecondaryHost(String secondaryHost) { + this.secondaryHost = secondaryHost; + } +} 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 b6407c72777e..9aa21b382eb2 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 @@ -13,8 +13,6 @@ import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import java.time.Duration; - import static com.azure.spring.cloud.autoconfigure.cosmos.AzureCosmosPropertiesTest.TEST_ENDPOINT_HTTPS; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -73,13 +71,13 @@ void configureAzureCosmosProperties() { AzureGlobalProperties azureProperties = new AzureGlobalProperties(); azureProperties.getCredential().setClientId("azure-client-id"); azureProperties.getCredential().setClientSecret("azure-client-secret"); - azureProperties.getRetry().getBackoff().setDelay(Duration.ofSeconds(2)); + azureProperties.getProxy().setHostname("localhost"); this.contextRunner .withBean(AzureGlobalProperties.class, () -> azureProperties) .withBean(CosmosClientBuilder.class, () -> mock(CosmosClientBuilder.class)) .withPropertyValues("spring.cloud.azure.cosmos.credential.client-id=cosmos-client-id", - "spring.cloud.azure.cosmos.retry.backoff.delay=2m", + "spring.cloud.azure.cosmos.proxy.nonProxyHosts=127.0.0.1", "spring.cloud.azure.cosmos.endpoint=" + TEST_ENDPOINT_HTTPS, "spring.cloud.azure.cosmos.key=cosmos-key" ) @@ -88,7 +86,8 @@ void configureAzureCosmosProperties() { final AzureCosmosProperties properties = context.getBean(AzureCosmosProperties.class); assertThat(properties).extracting("credential.clientId").isEqualTo("cosmos-client-id"); assertThat(properties).extracting("credential.clientSecret").isEqualTo("azure-client-secret"); - assertThat(properties).extracting("retry.backoff.delay").isEqualTo(Duration.ofMinutes(2)); + assertThat(properties).extracting("proxy.hostname").isEqualTo("localhost"); + assertThat(properties).extracting("proxy.nonProxyHosts").isEqualTo("127.0.0.1"); assertThat(properties).extracting("endpoint").isEqualTo(TEST_ENDPOINT_HTTPS); assertThat(properties).extracting("key").isEqualTo("cosmos-key"); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/eventhubs/AzureEventHubAutoConfigurationTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/eventhubs/AzureEventHubAutoConfigurationTest.java index 6546e5ecfb02..95302f3a2ce4 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/eventhubs/AzureEventHubAutoConfigurationTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/eventhubs/AzureEventHubAutoConfigurationTest.java @@ -11,6 +11,8 @@ import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import java.time.Duration; + import static org.assertj.core.api.Assertions.assertThat; class AzureEventHubAutoConfigurationTest { @@ -55,4 +57,30 @@ void configureWithConnectionString() { .run(context -> assertThat(context).hasSingleBean(AzureEventHubProperties.class)); } + @Test + void configureAzureEventHubProperties() { + AzureGlobalProperties azureProperties = new AzureGlobalProperties(); + azureProperties.getCredential().setClientId("azure-client-id"); + azureProperties.getCredential().setClientSecret("azure-client-secret"); + azureProperties.getRetry().getBackoff().setDelay(Duration.ofSeconds(2)); + + this.contextRunner + .withBean(AzureGlobalProperties.class, () -> azureProperties) + .withPropertyValues( + "spring.cloud.azure.eventhubs.credential.client-id=eventhubs-client-id", + "spring.cloud.azure.eventhubs.retry.backoff.delay=2m", + "spring.cloud.azure.eventhubs.connection-string=test-connection-string" + ) + .run(context -> { + assertThat(context).hasSingleBean(AzureEventHubProperties.class); + final AzureEventHubProperties properties = context.getBean(AzureEventHubProperties.class); + assertThat(properties).extracting("credential.clientId").isEqualTo("eventhubs-client-id"); + assertThat(properties).extracting("credential.clientSecret").isEqualTo("azure-client-secret"); + assertThat(properties).extracting("retry.backoff.delay").isEqualTo(Duration.ofMinutes(2)); + assertThat(properties).extracting("connectionString").isEqualTo("test-connection-string"); + + assertThat(azureProperties.getCredential().getClientId()).isEqualTo("azure-client-id"); + }); + } + } 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 new file mode 100644 index 000000000000..68dc524df463 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/AzureProfileAware.java @@ -0,0 +1,72 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.aware; + +/** + * Interface to be implemented by classes that wish to be aware of the Azure profile. + */ +public interface AzureProfileAware { + + Profile getProfile(); + + /** + * Interface to be implemented by classes that wish to describe an Azure cloud profile. + */ + interface Profile { + + String getTenantId(); + + String getSubscriptionId(); + + String getCloud(); + + Environment getEnvironment(); + + } + + /** + * Interface to be implemented by classes that wish to describe an Azure cloud environment. + */ + interface Environment { + + String getPortal(); + + String getPublishingProfile(); + + String getManagementEndpoint(); + + String getResourceManagerEndpoint(); + + String getSqlManagementEndpoint(); + + String getSqlServerHostnameSuffix(); + + String getGalleryEndpoint(); + + String getActiveDirectoryEndpoint(); + + String getActiveDirectoryResourceId(); + + String getActiveDirectoryGraphEndpoint(); + + String getMicrosoftGraphEndpoint(); + + String getDataLakeEndpointResourceId(); + + String getActiveDirectoryGraphApiVersion(); + + String getStorageEndpointSuffix(); + + String getKeyVaultDnsSuffix(); + + String getAzureDataLakeStoreFileSystemEndpointSuffix(); + + String getAzureDataLakeAnalyticsCatalogAndJobEndpointSuffix(); + + String getAzureLogAnalyticsEndpoint(); + + String getAzureApplicationInsightsEndpoint(); + + } +} 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 new file mode 100644 index 000000000000..09dc1314517d --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/ClientAware.java @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.aware; + +import com.azure.core.amqp.AmqpTransportType; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.spring.core.properties.client.HeaderProperties; + +import java.time.Duration; +import java.util.List; +import java.util.Set; + +/** + * Interface to be implemented by classes that wish to be aware of the client properties. + */ +public interface ClientAware { + + Client getClient(); + + /** + * Interface to be implemented by classes that wish to describe sdk client common options. + */ + interface Client { + + String getApplicationId(); + + List getHeaders(); + + Logging getLogging(); + + } + + /** + * Interface to be implemented by classes that wish to describe a http based client sdk. + */ + interface HttpClient extends Client { + Duration getWriteTimeout(); + + Duration getResponseTimeout(); + + Duration getReadTimeout(); + + } + + /** + * 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. + * + * 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 { + + HttpLogDetailLevel getLevel(); + + Set getAllowedHeaderNames(); + + Set getAllowedQueryParamNames(); + + Boolean getPrettyPrintBody(); + + } +} diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/ProxyAware.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/ProxyAware.java new file mode 100644 index 000000000000..ab6159d0ed2d --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/ProxyAware.java @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.aware; + +/** + * Interface to be implemented by classes that wish to be aware of the proxy properties. + */ +public interface ProxyAware { + + Proxy getProxy(); + + /** + * Interface to be implemented by classes that wish to describe the http based client proxy. + */ + interface HttpProxy { + + String getNonProxyHosts(); + } + + /** + * Interface to be implemented by classes that wish to describe the proxy. + */ + interface Proxy { + + String getType(); + + String getHostname(); + + int getPort(); + + String getAuthenticationType(); + + String getUsername(); + + String getPassword(); + + } + +} 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 new file mode 100644 index 000000000000..282923c60eb5 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/RetryAware.java @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.aware; + +import java.time.Duration; +import java.time.temporal.ChronoUnit; + +/** + * Interface to be implemented by classes that wish to be aware of the retry properties. + */ +public interface RetryAware { + + Retry getRetry(); + + /** + * Interface to be implemented by classes that wish to describe retry operations. + */ + interface Retry { + + Integer getMaxAttempts(); + + Duration getTimeout(); + + Backoff getBackoff(); + } + + /** + * Interface to be implemented by classes that wish to describe http related retry operations. + */ + interface HttpRetry extends Retry { + + String getRetryAfterHeader(); + + ChronoUnit getRetryAfterTimeUnit(); + } + + /** + * Interface to be implemented by classes that wish to describe the backoff when retrying. + */ + interface Backoff { + + Duration getDelay(); + + Duration getMaxDelay(); + + Double getMultiplier(); + } +} diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/aware/credential/ConnectionStringAware.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/ConnectionStringAware.java similarity index 70% rename from sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/aware/credential/ConnectionStringAware.java rename to sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/ConnectionStringAware.java index 49dd7aa6e247..a9a5cd21b602 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/aware/credential/ConnectionStringAware.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/ConnectionStringAware.java @@ -1,15 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.core.properties.aware.credential; +package com.azure.spring.core.aware.authentication; /** * Interface to be implemented by classes that wish to be aware of the connection string. */ public interface ConnectionStringAware { - void setConnectionString(String connectionString); - String getConnectionString(); } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/aware/credential/KeyAware.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/KeyAware.java similarity index 72% rename from sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/aware/credential/KeyAware.java rename to sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/KeyAware.java index 9bc87bfc686d..a5a7ea6c1877 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/aware/credential/KeyAware.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/KeyAware.java @@ -1,14 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.core.properties.aware.credential; +package com.azure.spring.core.aware.authentication; /** * Interface to be implemented by classes that wish to be aware of the key. */ public interface KeyAware { - void setKey(String key); - String getKey(); + } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/aware/credential/NamedKeyAware.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/NamedKeyAware.java similarity index 59% rename from sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/aware/credential/NamedKeyAware.java rename to sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/NamedKeyAware.java index 25222ba67a9e..f471ef837c9c 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/aware/credential/NamedKeyAware.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/NamedKeyAware.java @@ -1,16 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.core.properties.aware.credential; +package com.azure.spring.core.aware.authentication; -import com.azure.spring.core.properties.credential.NamedKeyProperties; +import com.azure.spring.core.properties.authentication.NamedKeyProperties; /** * Interface to be implemented by classes that wish to be aware of the named key. */ public interface NamedKeyAware { - void setNamedKey(NamedKeyProperties namedKey); - NamedKeyProperties getNamedKey(); } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/aware/credential/SasTokenAware.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/SasTokenAware.java similarity index 71% rename from sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/aware/credential/SasTokenAware.java rename to sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/SasTokenAware.java index e948ae005cba..6cc2e0e76a72 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/aware/credential/SasTokenAware.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/SasTokenAware.java @@ -1,15 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.core.properties.aware.credential; +package com.azure.spring.core.aware.authentication; /** * Interface to be implemented by classes that wish to be aware of the sas token. */ public interface SasTokenAware { - void setSasToken(String sasToken); - String getSasToken(); } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/TokenCredentialAware.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/TokenCredentialAware.java new file mode 100644 index 000000000000..5819f62d448c --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/aware/authentication/TokenCredentialAware.java @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.aware.authentication; + + +/** + * Interface to be implemented by classes that wish to be aware of the token credential. + */ +public interface TokenCredentialAware { + + TokenCredential getCredential(); + + /** + * Interface to be implemented by classes that wish to describe the token credential related options. + */ + interface TokenCredential { + + String getClientId(); + + String getClientSecret(); + + String getClientCertificatePath(); + + String getClientCertificatePassword(); + + String getUsername(); + + String getPassword(); + + String getManagedIdentityClientId(); + + } + +} diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureAmqpProxyOptionsConverter.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureAmqpProxyOptionsConverter.java index bd833bc0c2b2..7722691d0b1d 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureAmqpProxyOptionsConverter.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureAmqpProxyOptionsConverter.java @@ -5,7 +5,7 @@ import com.azure.core.amqp.ProxyAuthenticationType; import com.azure.core.amqp.ProxyOptions; -import com.azure.spring.core.properties.proxy.ProxyProperties; +import com.azure.spring.core.aware.ProxyAware; import org.springframework.core.convert.converter.Converter; import org.springframework.util.StringUtils; @@ -13,17 +13,19 @@ import java.net.Proxy; /** - * Converts a {@link ProxyProperties} to a {@link ProxyOptions}. + * Converts a {@link ProxyAware.Proxy} to a {@link ProxyOptions}. */ -public final class AzureAmqpProxyOptionsConverter implements Converter { +public final class AzureAmqpProxyOptionsConverter implements Converter { + + public static final AzureAmqpProxyOptionsConverter AMQP_PROXY_CONVERTER = new AzureAmqpProxyOptionsConverter(); @Override - public ProxyOptions convert(ProxyProperties properties) { - if (!StringUtils.hasText(properties.getHostname())) { + public ProxyOptions convert(ProxyAware.Proxy proxy) { + if (!StringUtils.hasText(proxy.getHostname())) { return null; } ProxyAuthenticationType authenticationType; - switch (properties.getAuthenticationType()) { + switch (proxy.getAuthenticationType()) { case "basic": authenticationType = ProxyAuthenticationType.BASIC; break; @@ -34,7 +36,7 @@ public ProxyOptions convert(ProxyProperties properties) { authenticationType = ProxyAuthenticationType.NONE; } Proxy.Type type; - switch (properties.getType()) { + switch (proxy.getType()) { case "http": type = Proxy.Type.HTTP; break; @@ -44,7 +46,7 @@ public ProxyOptions convert(ProxyProperties properties) { default: type = Proxy.Type.DIRECT; } - Proxy proxyAddress = new Proxy(type, new InetSocketAddress(properties.getHostname(), properties.getPort())); - return new ProxyOptions(authenticationType, proxyAddress, properties.getUsername(), properties.getPassword()); + Proxy proxyAddress = new Proxy(type, new InetSocketAddress(proxy.getHostname(), proxy.getPort())); + return new ProxyOptions(authenticationType, proxyAddress, proxy.getUsername(), proxy.getPassword()); } } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureAmqpRetryOptionsConverter.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureAmqpRetryOptionsConverter.java index d1cd77e49d1f..89af16519ffa 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureAmqpRetryOptionsConverter.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureAmqpRetryOptionsConverter.java @@ -5,40 +5,43 @@ import com.azure.core.amqp.AmqpRetryMode; import com.azure.core.amqp.AmqpRetryOptions; +import com.azure.spring.core.aware.RetryAware; import com.azure.spring.core.properties.retry.RetryProperties; import org.springframework.core.convert.converter.Converter; /** * Converts a {@link RetryProperties} to a {@link AmqpRetryOptions}. */ -public final class AzureAmqpRetryOptionsConverter implements Converter { +public final class AzureAmqpRetryOptionsConverter implements Converter { + + public static final AzureAmqpRetryOptionsConverter AMQP_RETRY_CONVERTER = new AzureAmqpRetryOptionsConverter(); @Override - public AmqpRetryOptions convert(RetryProperties retryProperties) { + public AmqpRetryOptions convert(RetryAware.Retry retry) { AmqpRetryOptions retryOptions = new AmqpRetryOptions(); - if (retryProperties.getMaxAttempts() != null) { - retryOptions.setMaxRetries(retryProperties.getMaxAttempts()); + if (retry.getMaxAttempts() != null) { + retryOptions.setMaxRetries(retry.getMaxAttempts()); } - if (retryProperties.getTimeout() != null) { - retryOptions.setTryTimeout(retryProperties.getTimeout()); + if (retry.getTimeout() != null) { + retryOptions.setTryTimeout(retry.getTimeout()); } AmqpRetryMode mode; - final RetryProperties.BackoffProperties backoffProperties = retryProperties.getBackoff(); - if (backoffProperties != null) { - if (backoffProperties.getMultiplier() != null && backoffProperties.getMultiplier() > 0) { + final RetryAware.Backoff backoff = retry.getBackoff(); + if (backoff != null) { + if (backoff.getMultiplier() != null && backoff.getMultiplier() > 0) { mode = AmqpRetryMode.EXPONENTIAL; } else { mode = AmqpRetryMode.FIXED; } retryOptions.setMode(mode); - if (backoffProperties.getDelay() != null) { - retryOptions.setDelay(backoffProperties.getDelay()); + if (backoff.getDelay() != null) { + retryOptions.setDelay(backoff.getDelay()); } - if (backoffProperties.getMaxDelay() != null) { - retryOptions.setMaxDelay(backoffProperties.getMaxDelay()); + if (backoff.getMaxDelay() != null) { + retryOptions.setMaxDelay(backoff.getMaxDelay()); } } return retryOptions; 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 8da769de90f1..950741fdd4ee 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 @@ -4,16 +4,18 @@ package com.azure.spring.core.converter; import com.azure.core.http.policy.HttpLogOptions; -import com.azure.spring.core.properties.client.ClientProperties; +import com.azure.spring.core.aware.ClientAware; import org.springframework.core.convert.converter.Converter; /** - * Converts a {@link ClientProperties.LoggingProperties} to a {@link HttpLogOptions}. + * Converts a {@link ClientAware.Logging} 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(ClientProperties.LoggingProperties logging) { + public HttpLogOptions convert(ClientAware.Logging 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/converter/AzureHttpProxyOptionsConverter.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureHttpProxyOptionsConverter.java index 07d5ece7a78f..c6732fa191de 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureHttpProxyOptionsConverter.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureHttpProxyOptionsConverter.java @@ -15,6 +15,8 @@ */ public final class AzureHttpProxyOptionsConverter implements Converter { + public static final AzureHttpProxyOptionsConverter HTTP_PROXY_CONVERTER = new AzureHttpProxyOptionsConverter(); + @Override public ProxyOptions convert(HttpProxyProperties proxyProperties) { if (!StringUtils.hasText(proxyProperties.getHostname())) { diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureHttpRetryPolicyConverter.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureHttpRetryPolicyConverter.java new file mode 100644 index 000000000000..8fb310072a91 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/converter/AzureHttpRetryPolicyConverter.java @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.converter; + +import com.azure.core.http.policy.ExponentialBackoff; +import com.azure.core.http.policy.FixedDelay; +import com.azure.core.http.policy.RetryPolicy; +import com.azure.core.http.policy.RetryStrategy; +import com.azure.spring.core.aware.RetryAware; +import org.springframework.core.convert.converter.Converter; +import org.springframework.lang.NonNull; + +/** + * Converts a {@link RetryAware.HttpRetry} to a {@link RetryPolicy}. + */ +public final class AzureHttpRetryPolicyConverter implements Converter { + + public static final AzureHttpRetryPolicyConverter HTTP_RETRY_CONVERTER = new AzureHttpRetryPolicyConverter(); + + @Override + public RetryPolicy convert(@NonNull RetryAware.HttpRetry httpRetry) { + Integer maxAttempts = httpRetry.getMaxAttempts(); + if (maxAttempts == null) { + return new RetryPolicy(); + } + + final RetryAware.Backoff backoff = httpRetry.getBackoff(); + RetryStrategy retryStrategy; + + if (backoff.getMultiplier() != null && backoff.getMultiplier() > 0) { + // TODO (xiada): multiplier can't be set to the ExponentialBackoff, should we write our own strategy here? + retryStrategy = new ExponentialBackoff(maxAttempts, backoff.getDelay(), backoff.getMaxDelay()); + } else { + retryStrategy = new FixedDelay(maxAttempts, backoff.getDelay()); + } + + return new RetryPolicy(retryStrategy, httpRetry.getRetryAfterHeader(), httpRetry.getRetryAfterTimeUnit()); + } +} diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/AzureCredentialType.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/AzureCredentialType.java index d350523f8d60..78caa809e79d 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/AzureCredentialType.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/AzureCredentialType.java @@ -17,7 +17,6 @@ public final class AzureCredentialType { public static final AzureCredentialType KEY_CREDENTIAL = new AzureCredentialType("key_credential"); public static final AzureCredentialType SAS_CREDENTIAL = new AzureCredentialType("sas_credential"); public static final AzureCredentialType NAMED_KEY_CREDENTIAL = new AzureCredentialType("named_key_credential"); - public static final AzureCredentialType CONNECTION_STRING_CREDENTIAL = new AzureCredentialType("connection_string"); private final String type; diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureKeyCredentialResolver.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureKeyCredentialResolver.java index 01aaa16e2ed8..c3fbcc3d4cae 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureKeyCredentialResolver.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureKeyCredentialResolver.java @@ -5,7 +5,7 @@ import com.azure.spring.core.credential.provider.AzureKeyCredentialProvider; import com.azure.spring.core.properties.AzureProperties; -import com.azure.spring.core.properties.aware.credential.KeyAware; +import com.azure.spring.core.aware.authentication.KeyAware; import org.springframework.util.StringUtils; /** diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureNamedKeyCredentialResolver.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureNamedKeyCredentialResolver.java index 829b482bc3a3..a39fbac36317 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureNamedKeyCredentialResolver.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureNamedKeyCredentialResolver.java @@ -5,8 +5,8 @@ import com.azure.spring.core.credential.provider.AzureNamedKeyCredentialProvider; import com.azure.spring.core.properties.AzureProperties; -import com.azure.spring.core.properties.aware.credential.NamedKeyAware; -import com.azure.spring.core.properties.credential.NamedKeyProperties; +import com.azure.spring.core.aware.authentication.NamedKeyAware; +import com.azure.spring.core.properties.authentication.NamedKeyProperties; import org.springframework.util.StringUtils; /** diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureSasCredentialResolver.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureSasCredentialResolver.java index 5649ef25753d..2ef204322498 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureSasCredentialResolver.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureSasCredentialResolver.java @@ -5,7 +5,7 @@ import com.azure.spring.core.credential.provider.AzureSasCredentialProvider; import com.azure.spring.core.properties.AzureProperties; -import com.azure.spring.core.properties.aware.credential.SasTokenAware; +import com.azure.spring.core.aware.authentication.SasTokenAware; import org.springframework.util.StringUtils; /** diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureTokenCredentialResolver.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureTokenCredentialResolver.java index d1141d78e3d7..6f5a3e6b51e4 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureTokenCredentialResolver.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/credential/resolver/AzureTokenCredentialResolver.java @@ -9,9 +9,9 @@ import com.azure.identity.ClientSecretCredentialBuilder; import com.azure.identity.ManagedIdentityCredential; import com.azure.identity.ManagedIdentityCredentialBuilder; +import com.azure.spring.core.aware.authentication.TokenCredentialAware; import com.azure.spring.core.credential.provider.AzureTokenCredentialProvider; import com.azure.spring.core.properties.AzureProperties; -import com.azure.spring.core.properties.credential.TokenCredentialProperties; import org.springframework.util.StringUtils; /** @@ -22,7 +22,7 @@ public class AzureTokenCredentialResolver implements AzureCredentialResolver extends AbstractA private static final Logger LOGGER = LoggerFactory.getLogger(AbstractAzureAmqpClientBuilderFactory.class); private ClientOptions clientOptions = new ClientOptions(); - private final AzureAmqpProxyOptionsConverter proxyOptionsConverter = new AzureAmqpProxyOptionsConverter(); - private final AzureAmqpRetryOptionsConverter retryOptionsConverter = new AzureAmqpRetryOptionsConverter(); protected abstract BiConsumer consumeProxyOptions(); protected abstract BiConsumer consumeAmqpTransportType(); protected abstract BiConsumer consumeAmqpRetryOptions(); @@ -45,15 +43,15 @@ protected void configureAmqpClient(T builder) { } protected void configureAmqpTransportProperties(T builder) { - final ClientProperties clientProperties = getAzureProperties().getClient(); - if (clientProperties == null) { + final ClientAware.Client client = getAzureProperties().getClient(); + if (client == null) { return; } - final AmqpClientProperties properties; - if (clientProperties instanceof AmqpClientProperties) { - properties = (AmqpClientProperties) clientProperties; - consumeAmqpTransportType().accept(builder, properties.getTransportType()); + final ClientAware.AmqpClient amqpClient; + if (client instanceof ClientAware.AmqpClient) { + amqpClient = (ClientAware.AmqpClient) client; + consumeAmqpTransportType().accept(builder, amqpClient.getTransportType()); } } @@ -68,11 +66,11 @@ protected void configureApplicationId(T builder) { @Override protected void configureRetry(T builder) { - final RetryProperties retry = getAzureProperties().getRetry(); + final RetryAware.Retry retry = getAzureProperties().getRetry(); if (retry == null) { return; } - AmqpRetryOptions retryOptions = retryOptionsConverter.convert(retry); + AmqpRetryOptions retryOptions = AMQP_RETRY_CONVERTER.convert(retry); consumeAmqpRetryOptions().accept(builder, retryOptions); } @@ -82,7 +80,7 @@ protected void configureProxy(T builder) { return; } - final ProxyOptions proxyOptions = proxyOptionsConverter.convert(getAzureProperties().getProxy()); + final ProxyOptions proxyOptions = AMQP_PROXY_CONVERTER.convert(getAzureProperties().getProxy()); if (proxyOptions != null) { consumeProxyOptions().accept(builder, proxyOptions); } else { 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 890fa4106c96..428d3cbb81e3 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 @@ -9,15 +9,14 @@ import com.azure.core.http.ProxyOptions; import com.azure.core.http.policy.HttpLogOptions; import com.azure.core.http.policy.HttpPipelinePolicy; +import com.azure.core.http.policy.RetryPolicy; import com.azure.core.util.Header; import com.azure.core.util.HttpClientOptions; -import com.azure.spring.core.converter.AzureHttpLogOptionsConverter; -import com.azure.spring.core.converter.AzureHttpProxyOptionsConverter; +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.http.DefaultHttpProvider; -import com.azure.spring.core.properties.client.ClientProperties; -import com.azure.spring.core.properties.client.HttpClientProperties; import com.azure.spring.core.properties.proxy.HttpProxyProperties; -import com.azure.spring.core.properties.proxy.ProxyProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,6 +26,10 @@ import java.util.function.BiConsumer; import java.util.stream.Collectors; +import static com.azure.spring.core.converter.AzureHttpLogOptionsConverter.HTTP_LOG_OPTIONS_CONVERTER; +import static com.azure.spring.core.converter.AzureHttpProxyOptionsConverter.HTTP_PROXY_CONVERTER; +import static com.azure.spring.core.converter.AzureHttpRetryPolicyConverter.HTTP_RETRY_CONVERTER; + /** * Abstract factory of the http client builder. * @@ -35,13 +38,11 @@ public abstract class AbstractAzureHttpClientBuilderFactory extends AbstractAzureServiceClientBuilderFactory { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractAzureHttpClientBuilderFactory.class); + private final HttpClientOptions httpClientOptions = new HttpClientOptions(); private HttpClientProvider httpClientProvider = new DefaultHttpProvider(); private final List httpPipelinePolicies = new ArrayList<>(); private HttpPipeline httpPipeline; - private final AzureHttpProxyOptionsConverter proxyOptionsConverter = new AzureHttpProxyOptionsConverter(); - private final AzureHttpLogOptionsConverter logOptionsConverter = new AzureHttpLogOptionsConverter(); - protected abstract BiConsumer consumeHttpClient(); protected abstract BiConsumer consumeHttpPipelinePolicy(); @@ -50,6 +51,8 @@ public abstract class AbstractAzureHttpClientBuilderFactory extends AbstractA protected abstract BiConsumer consumeHttpLogOptions(); + protected abstract BiConsumer consumeRetryPolicy(); + @Override protected void configureCore(T builder) { super.configureCore(builder); @@ -71,20 +74,20 @@ protected void configureHttpClient(T builder) { @Override protected void configureProxy(T builder) { - final ProxyProperties proxyProperties = getAzureProperties().getProxy(); - if (proxyProperties == null) { + final ProxyAware.Proxy proxy = getAzureProperties().getProxy(); + if (proxy == null) { return; } - if (proxyProperties instanceof HttpProxyProperties) { - ProxyOptions proxyOptions = proxyOptionsConverter.convert((HttpProxyProperties) proxyProperties); + if (proxy instanceof HttpProxyProperties) { + ProxyOptions proxyOptions = HTTP_PROXY_CONVERTER.convert((HttpProxyProperties) proxy); if (proxyOptions != null) { this.httpClientOptions.setProxyOptions(proxyOptions); } else { LOGGER.debug("No HTTP proxy properties available."); } } else { - LOGGER.warn("Non-http proxy configuration will not be applied."); + LOGGER.debug("No HTTP proxy configuration will not be applied."); } } @@ -98,19 +101,19 @@ protected void configureHttpHeaders(T builder) { } protected void configureHttpLogOptions(T builder) { - ClientProperties client = getAzureProperties().getClient(); - HttpLogOptions logOptions = this.logOptionsConverter.convert(client.getLogging()); + ClientAware.Client client = getAzureProperties().getClient(); + HttpLogOptions logOptions = HTTP_LOG_OPTIONS_CONVERTER.convert(client.getLogging()); consumeHttpLogOptions().accept(builder, logOptions); } protected void configureHttpTransportProperties(T builder) { - final ClientProperties clientProperties = getAzureProperties().getClient(); - if (clientProperties == null) { + final ClientAware.Client client = getAzureProperties().getClient(); + if (client == null) { return; } - final HttpClientProperties properties; - if (clientProperties instanceof HttpClientProperties) { - properties = (HttpClientProperties) clientProperties; + final ClientAware.HttpClient properties; + if (client instanceof ClientAware.HttpClient) { + properties = (ClientAware.HttpClient) client; httpClientOptions.setWriteTimeout(properties.getWriteTimeout()); httpClientOptions.responseTimeout(properties.getResponseTimeout()); httpClientOptions.readTimeout(properties.getReadTimeout()); @@ -119,7 +122,17 @@ protected void configureHttpTransportProperties(T builder) { @Override protected void configureRetry(T builder) { + RetryAware.Retry retry = getAzureProperties().getRetry(); + if (retry == null) { + return; + } + if (retry instanceof RetryAware.HttpRetry) { + RetryPolicy retryPolicy = HTTP_RETRY_CONVERTER.convert((RetryAware.HttpRetry) retry); + consumeRetryPolicy().accept(builder, retryPolicy); + } else { + LOGGER.warn("Retry properties of type {} in an http client builder factory.", retry.getClass().getName()); + } } protected void configureHttpPipelinePolicies(T builder) { @@ -127,8 +140,9 @@ protected void configureHttpPipelinePolicies(T builder) { consumeHttpPipelinePolicy().accept(builder, policy); } } + protected List
getHeaders() { - final ClientProperties client = getAzureProperties().getClient(); + final ClientAware.Client client = getAzureProperties().getClient(); if (client == null || client.getHeaders() == null) { return null; } 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 8e820a70f42e..0db46b2ef0cb 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 @@ -4,9 +4,11 @@ package com.azure.spring.core.factory; import com.azure.core.credential.TokenCredential; -import com.azure.core.management.AzureEnvironment; 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; import com.azure.spring.core.credential.descriptor.AuthenticationDescriptor; import com.azure.spring.core.credential.provider.AzureCredentialProvider; @@ -15,8 +17,6 @@ import com.azure.spring.core.customizer.AzureServiceClientBuilderCustomizer; import com.azure.spring.core.customizer.NoOpAzureServiceClientBuilderCustomizer; import com.azure.spring.core.properties.AzureProperties; -import com.azure.spring.core.properties.aware.credential.ConnectionStringAware; -import com.azure.spring.core.properties.client.ClientProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; @@ -57,7 +57,6 @@ public abstract class AbstractAzureServiceClientBuilderFactory implements Azu protected abstract BiConsumer consumeConnectionString(); protected TokenCredential defaultTokenCredential = DEFAULT_TOKEN_CREDENTIAL; - private AzureEnvironment azureEnvironment = AzureEnvironment.AZURE; private String applicationId; // end-user private String springIdentifier; private ConnectionStringProvider connectionStringProvider; @@ -89,8 +88,11 @@ protected void configureCore(T builder) { } protected void configureAzureEnvironment(T builder) { + AzureProfileAware.Profile profile = getAzureProperties().getProfile(); + Configuration configuration = new Configuration(); - configuration.put(Configuration.PROPERTY_AZURE_AUTHORITY_HOST, this.azureEnvironment.getActiveDirectoryEndpoint()); + configuration.put(Configuration.PROPERTY_AZURE_AUTHORITY_HOST, profile.getEnvironment().getActiveDirectoryEndpoint()); + consumeConfiguration().accept(builder, configuration); } @@ -161,18 +163,9 @@ private AzureCredentialProvider resolveAzureCredential(AzureProperties azureP return credentialResolvers.resolve(azureProperties); } - protected AzureEnvironment getAzureEnvironment() { - return azureEnvironment; - } - - public void setAzureEnvironment(AzureEnvironment azureEnvironment) { - this.azureEnvironment = azureEnvironment; - } - protected String getApplicationId() { - final ClientProperties clientProperties = getAzureProperties().getClient(); - return this.applicationId != null ? this.applicationId : (clientProperties != null - ? clientProperties.getApplicationId() : null); + final ClientAware.Client client = getAzureProperties().getClient(); + return this.applicationId != null ? this.applicationId : (client != null ? client.getApplicationId() : null); } public void setApplicationId(String applicationId) { diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AzureCredentialBuilderFactory.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AzureCredentialBuilderFactory.java index 3698c436bd7f..b2505da61df8 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AzureCredentialBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/factory/AzureCredentialBuilderFactory.java @@ -8,8 +8,10 @@ import com.azure.core.http.HttpPipeline; import com.azure.core.http.policy.HttpLogOptions; import com.azure.core.http.policy.HttpPipelinePolicy; +import com.azure.core.http.policy.RetryPolicy; import com.azure.core.util.Configuration; import com.azure.identity.CredentialBuilderBase; +import com.azure.spring.core.aware.RetryAware; import com.azure.spring.core.credential.descriptor.AuthenticationDescriptor; import com.azure.spring.core.properties.AzureProperties; @@ -84,4 +86,19 @@ protected BiConsumer consumeDefaultTokenCredential() { protected BiConsumer consumeConnectionString() { return (a, b) -> { }; } + + @Override + protected void configureRetry(T builder) { + RetryAware.Retry retry = getAzureProperties().getRetry(); + if (retry != null && retry.getMaxAttempts() != null) { + builder.maxRetry(retry.getMaxAttempts()); + // TODO (xiada): don't know how to specify the retryTimeout +// builder.retryTimeout() + } + } + + @Override + protected BiConsumer consumeRetryPolicy() { + return null; + } } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzureProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzureProperties.java index db205e02ea14..2f2e329e0f0f 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzureProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzureProperties.java @@ -3,25 +3,15 @@ package com.azure.spring.core.properties; -import com.azure.spring.core.properties.client.ClientProperties; -import com.azure.spring.core.properties.credential.TokenCredentialProperties; -import com.azure.spring.core.properties.profile.AzureProfile; -import com.azure.spring.core.properties.proxy.ProxyProperties; -import com.azure.spring.core.properties.retry.RetryProperties; +import com.azure.spring.core.aware.AzureProfileAware; +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.aware.authentication.TokenCredentialAware; /** * Unified properties for Azure SDK clients. */ -public interface AzureProperties { - - ClientProperties getClient(); - - ProxyProperties getProxy(); - - RetryProperties getRetry(); - - TokenCredentialProperties getCredential(); - - AzureProfile getProfile(); +public interface AzureProperties extends RetryAware, ClientAware, ProxyAware, TokenCredentialAware, AzureProfileAware { } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzureSdkProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzureSdkProperties.java index 4e17e33c64dd..d930e02dc9bf 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzureSdkProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/AzureSdkProperties.java @@ -4,7 +4,7 @@ package com.azure.spring.core.properties; import com.azure.spring.core.properties.client.ClientProperties; -import com.azure.spring.core.properties.credential.TokenCredentialProperties; +import com.azure.spring.core.properties.authentication.TokenCredentialProperties; import com.azure.spring.core.properties.profile.AzureProfile; import com.azure.spring.core.properties.proxy.ProxyProperties; import com.azure.spring.core.properties.retry.RetryProperties; diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/credential/NamedKeyProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/authentication/NamedKeyProperties.java similarity index 89% rename from sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/credential/NamedKeyProperties.java rename to sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/authentication/NamedKeyProperties.java index 2a483dea3db5..8208555092a1 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/credential/NamedKeyProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/authentication/NamedKeyProperties.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.core.properties.credential; +package com.azure.spring.core.properties.authentication; /** * Represents a pojo containing the key and the name of the key. diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/credential/TokenCredentialProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/authentication/TokenCredentialProperties.java similarity index 91% rename from sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/credential/TokenCredentialProperties.java rename to sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/authentication/TokenCredentialProperties.java index e8d5e3faa643..4957df3ca658 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/credential/TokenCredentialProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/authentication/TokenCredentialProperties.java @@ -1,13 +1,15 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.core.properties.credential; +package com.azure.spring.core.properties.authentication; +import com.azure.spring.core.aware.authentication.TokenCredentialAware; + /** * Azure properties used for getting token credential. */ -public class TokenCredentialProperties { +public class TokenCredentialProperties implements TokenCredentialAware.TokenCredential { /** * Client id to use when performing service principal authentication with Azure. diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/AmqpClientProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/AmqpClientProperties.java index 6602a06f764f..d3634fba60a2 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/AmqpClientProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/AmqpClientProperties.java @@ -4,11 +4,12 @@ package com.azure.spring.core.properties.client; import com.azure.core.amqp.AmqpTransportType; +import com.azure.spring.core.aware.ClientAware; /** * Properties shared by all amqp client builders. */ -public class AmqpClientProperties extends ClientProperties { +public final class AmqpClientProperties extends ClientProperties implements ClientAware.AmqpClient { private AmqpTransportType transportType = AmqpTransportType.AMQP; 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 b074ceaaaa7a..2cdf879105e1 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 @@ -3,17 +3,15 @@ package com.azure.spring.core.properties.client; -import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.spring.core.aware.ClientAware; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; /** * Properties shared by all azure service client builders. */ -public class ClientProperties { +public class ClientProperties implements ClientAware.Client { private String applicationId; @@ -37,41 +35,4 @@ public LoggingProperties getLogging() { return logging; } - /** - * 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 static class LoggingProperties { - - private HttpLogDetailLevel level; - private final Set allowedHeaderNames = new HashSet<>(); - private final Set allowedQueryParamNames = new HashSet<>(); - 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-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 a66cb0c7cfe8..2b2762297520 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 @@ -3,12 +3,14 @@ package com.azure.spring.core.properties.client; +import com.azure.spring.core.aware.ClientAware; + import java.time.Duration; /** * Properties shared by all http client builders. */ -public class HttpClientProperties extends ClientProperties { +public final class HttpClientProperties extends ClientProperties implements ClientAware.HttpClient { private Duration writeTimeout; private Duration responseTimeout; 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 new file mode 100644 index 000000000000..5116f2b4228f --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/client/LoggingProperties.java @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.properties.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 LoggingProperties implements ClientAware.Logging { + + private HttpLogDetailLevel level; + private final Set allowedHeaderNames = new HashSet<>(); + private final Set allowedQueryParamNames = new HashSet<>(); + 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-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 new file mode 100644 index 000000000000..0cff55b7a421 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/profile/AzureEnvironment.java @@ -0,0 +1,268 @@ +// 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.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +/** + * The AzureEnvironment defines all properties to Azure services, such as endpoints, resource ids, etc. + */ +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; + private String resourceManagerEndpoint; + private String sqlManagementEndpoint; + private String sqlServerHostnameSuffix; + private String galleryEndpoint; + private String activeDirectoryEndpoint; + private String activeDirectoryResourceId; + private String activeDirectoryGraphEndpoint; + private String activeDirectoryGraphApiVersion; + private String microsoftGraphEndpoint; + private String dataLakeEndpointResourceId; + private String storageEndpointSuffix; + private String keyVaultDnsSuffix; + private String azureDataLakeStoreFileSystemEndpointSuffix; + private String azureDataLakeAnalyticsCatalogAndJobEndpointSuffix; + private String azureLogAnalyticsEndpoint; + private String azureApplicationInsightsEndpoint; + + public AzureEnvironment() { + + } + + public AzureEnvironment(com.azure.core.management.AzureEnvironment azureEnvironment) { + this.portal = azureEnvironment.getPortal(); + this.publishingProfile = azureEnvironment.getPublishingProfile(); + this.managementEndpoint = azureEnvironment.getManagementEndpoint(); + this.resourceManagerEndpoint = azureEnvironment.getResourceManagerEndpoint(); + this.sqlManagementEndpoint = azureEnvironment.getSqlManagementEndpoint(); + this.sqlServerHostnameSuffix = azureEnvironment.getSqlServerHostnameSuffix(); + this.galleryEndpoint = azureEnvironment.getGalleryEndpoint(); + this.activeDirectoryEndpoint = azureEnvironment.getActiveDirectoryEndpoint(); + this.activeDirectoryResourceId = azureEnvironment.getActiveDirectoryResourceId(); + this.activeDirectoryGraphEndpoint = azureEnvironment.getGraphEndpoint(); + this.activeDirectoryGraphApiVersion = azureEnvironment.getActiveDirectoryGraphApiVersion(); + this.microsoftGraphEndpoint = azureEnvironment.getMicrosoftGraphEndpoint(); + this.dataLakeEndpointResourceId = azureEnvironment.getDataLakeEndpointResourceId(); + this.storageEndpointSuffix = azureEnvironment.getStorageEndpointSuffix(); + this.keyVaultDnsSuffix = azureEnvironment.getKeyVaultDnsSuffix(); + this.azureDataLakeStoreFileSystemEndpointSuffix = azureEnvironment.getAzureDataLakeStoreFileSystemEndpointSuffix(); + this.azureDataLakeAnalyticsCatalogAndJobEndpointSuffix = azureEnvironment.getAzureDataLakeAnalyticsCatalogAndJobEndpointSuffix(); + this.azureLogAnalyticsEndpoint = azureEnvironment.getLogAnalyticsEndpoint(); + 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 Map exportEndpointsMap() { + return new HashMap() { + { + put("portalUrl", portal); + put("publishingProfileUrl", publishingProfile); + put("managementEndpointUrl", managementEndpoint); + put("resourceManagerEndpointUrl", resourceManagerEndpoint); + put("sqlManagementEndpointUrl", sqlManagementEndpoint); + put("sqlServerHostnameSuffix", sqlServerHostnameSuffix); + put("galleryEndpointUrl", galleryEndpoint); + put("activeDirectoryEndpointUrl", activeDirectoryEndpoint); + put("activeDirectoryResourceId", activeDirectoryResourceId); + put("activeDirectoryGraphResourceId", activeDirectoryGraphEndpoint); + put("microsoftGraphResourceId", microsoftGraphEndpoint); + put("dataLakeEndpointResourceId", dataLakeEndpointResourceId); + put("activeDirectoryGraphApiVersion", activeDirectoryGraphApiVersion); + put("storageEndpointSuffix", storageEndpointSuffix); + put("keyVaultDnsSuffix", keyVaultDnsSuffix); + put("azureDataLakeStoreFileSystemEndpointSuffix", azureDataLakeStoreFileSystemEndpointSuffix); + put("azureDataLakeAnalyticsCatalogAndJobEndpointSuffix", azureDataLakeAnalyticsCatalogAndJobEndpointSuffix); + put("azureLogAnalyticsResourceId", azureLogAnalyticsEndpoint); + put("azureApplicationInsightsResourceId", azureApplicationInsightsEndpoint); + } + }; + } + + public String getPortal() { + return portal; + } + + public void setPortal(String portal) { + this.portal = portal; + } + + public String getPublishingProfile() { + return publishingProfile; + } + + public void setPublishingProfile(String publishingProfile) { + this.publishingProfile = publishingProfile; + } + + public String getManagementEndpoint() { + return managementEndpoint; + } + + public void setManagementEndpoint(String managementEndpoint) { + this.managementEndpoint = managementEndpoint; + } + + public String getResourceManagerEndpoint() { + return resourceManagerEndpoint; + } + + public void setResourceManagerEndpoint(String resourceManagerEndpoint) { + this.resourceManagerEndpoint = resourceManagerEndpoint; + } + + public String getSqlManagementEndpoint() { + return sqlManagementEndpoint; + } + + public void setSqlManagementEndpoint(String sqlManagementEndpoint) { + this.sqlManagementEndpoint = sqlManagementEndpoint; + } + + public String getSqlServerHostnameSuffix() { + return sqlServerHostnameSuffix; + } + + public void setSqlServerHostnameSuffix(String sqlServerHostnameSuffix) { + this.sqlServerHostnameSuffix = sqlServerHostnameSuffix; + } + + public String getGalleryEndpoint() { + return galleryEndpoint; + } + + public void setGalleryEndpoint(String galleryEndpoint) { + this.galleryEndpoint = galleryEndpoint; + } + + public String getActiveDirectoryEndpoint() { + return activeDirectoryEndpoint; + } + + public void setActiveDirectoryEndpoint(String activeDirectoryEndpoint) { + this.activeDirectoryEndpoint = activeDirectoryEndpoint; + } + + public String getActiveDirectoryResourceId() { + return activeDirectoryResourceId; + } + + public void setActiveDirectoryResourceId(String activeDirectoryResourceId) { + this.activeDirectoryResourceId = activeDirectoryResourceId; + } + + public String getActiveDirectoryGraphEndpoint() { + return activeDirectoryGraphEndpoint; + } + + public void setActiveDirectoryGraphEndpoint(String activeDirectoryGraphEndpoint) { + this.activeDirectoryGraphEndpoint = activeDirectoryGraphEndpoint; + } + + public String getMicrosoftGraphEndpoint() { + return microsoftGraphEndpoint; + } + + public void setMicrosoftGraphEndpoint(String microsoftGraphEndpoint) { + this.microsoftGraphEndpoint = microsoftGraphEndpoint; + } + + public String getDataLakeEndpointResourceId() { + return dataLakeEndpointResourceId; + } + + public void setDataLakeEndpointResourceId(String dataLakeEndpointResourceId) { + this.dataLakeEndpointResourceId = dataLakeEndpointResourceId; + } + + public String getActiveDirectoryGraphApiVersion() { + return activeDirectoryGraphApiVersion; + } + + public void setActiveDirectoryGraphApiVersion(String activeDirectoryGraphApiVersion) { + this.activeDirectoryGraphApiVersion = activeDirectoryGraphApiVersion; + } + + public String getStorageEndpointSuffix() { + return storageEndpointSuffix; + } + + public void setStorageEndpointSuffix(String storageEndpointSuffix) { + this.storageEndpointSuffix = storageEndpointSuffix; + } + + public String getKeyVaultDnsSuffix() { + return keyVaultDnsSuffix; + } + + public void setKeyVaultDnsSuffix(String keyVaultDnsSuffix) { + this.keyVaultDnsSuffix = keyVaultDnsSuffix; + } + + public String getAzureDataLakeStoreFileSystemEndpointSuffix() { + return azureDataLakeStoreFileSystemEndpointSuffix; + } + + public void setAzureDataLakeStoreFileSystemEndpointSuffix(String azureDataLakeStoreFileSystemEndpointSuffix) { + this.azureDataLakeStoreFileSystemEndpointSuffix = azureDataLakeStoreFileSystemEndpointSuffix; + } + + public String getAzureDataLakeAnalyticsCatalogAndJobEndpointSuffix() { + return azureDataLakeAnalyticsCatalogAndJobEndpointSuffix; + } + + public void setAzureDataLakeAnalyticsCatalogAndJobEndpointSuffix(String azureDataLakeAnalyticsCatalogAndJobEndpointSuffix) { + this.azureDataLakeAnalyticsCatalogAndJobEndpointSuffix = azureDataLakeAnalyticsCatalogAndJobEndpointSuffix; + } + + public String getAzureLogAnalyticsEndpoint() { + return azureLogAnalyticsEndpoint; + } + + public void setAzureLogAnalyticsEndpoint(String azureLogAnalyticsEndpoint) { + this.azureLogAnalyticsEndpoint = azureLogAnalyticsEndpoint; + } + + public String getAzureApplicationInsightsEndpoint() { + return azureApplicationInsightsEndpoint; + } + + 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 0168880dadb2..a996705094b9 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 @@ -3,28 +3,18 @@ package com.azure.spring.core.properties.profile; -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; +import com.azure.spring.core.aware.AzureProfileAware; /** * The AzureProfile defines the properties related to an Azure subscription. */ -public class AzureProfile { +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; - public AzureProfile() { - - } - public String getTenantId() { return tenantId; } @@ -54,258 +44,4 @@ public AzureEnvironment getEnvironment() { return environment; } - /** - * The AzureEnvironment defines all properties to Azure services, such as endpoints, resource ids, etc. - */ - public static class AzureEnvironment { - - 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; - private String resourceManagerEndpoint; - private String sqlManagementEndpoint; - private String sqlServerHostnameSuffix; - private String galleryEndpoint; - private String activeDirectoryEndpoint; - private String activeDirectoryResourceId; - private String activeDirectoryGraphEndpoint; - private String activeDirectoryGraphApiVersion; - private String microsoftGraphEndpoint; - private String dataLakeEndpointResourceId; - private String storageEndpointSuffix; - private String keyVaultDnsSuffix; - private String azureDataLakeStoreFileSystemEndpointSuffix; - private String azureDataLakeAnalyticsCatalogAndJobEndpointSuffix; - private String azureLogAnalyticsEndpoint; - private String azureApplicationInsightsEndpoint; - - public AzureEnvironment() { - - } - - public AzureEnvironment(com.azure.core.management.AzureEnvironment azureEnvironment) { - this.portal = azureEnvironment.getPortal(); - this.publishingProfile = azureEnvironment.getPublishingProfile(); - this.managementEndpoint = azureEnvironment.getManagementEndpoint(); - this.resourceManagerEndpoint = azureEnvironment.getResourceManagerEndpoint(); - this.sqlManagementEndpoint = azureEnvironment.getSqlManagementEndpoint(); - this.sqlServerHostnameSuffix = azureEnvironment.getSqlServerHostnameSuffix(); - this.galleryEndpoint = azureEnvironment.getGalleryEndpoint(); - this.activeDirectoryEndpoint = azureEnvironment.getActiveDirectoryEndpoint(); - this.activeDirectoryResourceId = azureEnvironment.getActiveDirectoryResourceId(); - this.activeDirectoryGraphEndpoint = azureEnvironment.getGraphEndpoint(); - this.activeDirectoryGraphApiVersion = azureEnvironment.getActiveDirectoryGraphApiVersion(); - this.microsoftGraphEndpoint = azureEnvironment.getMicrosoftGraphEndpoint(); - this.dataLakeEndpointResourceId = azureEnvironment.getDataLakeEndpointResourceId(); - this.storageEndpointSuffix = azureEnvironment.getStorageEndpointSuffix(); - this.keyVaultDnsSuffix = azureEnvironment.getKeyVaultDnsSuffix(); - this.azureDataLakeStoreFileSystemEndpointSuffix = azureEnvironment.getAzureDataLakeStoreFileSystemEndpointSuffix(); - this.azureDataLakeAnalyticsCatalogAndJobEndpointSuffix = azureEnvironment.getAzureDataLakeAnalyticsCatalogAndJobEndpointSuffix(); - this.azureLogAnalyticsEndpoint = azureEnvironment.getLogAnalyticsEndpoint(); - 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 Map exportEndpointsMap() { - return new HashMap() { - { - put("portalUrl", portal); - put("publishingProfileUrl", publishingProfile); - put("managementEndpointUrl", managementEndpoint); - put("resourceManagerEndpointUrl", resourceManagerEndpoint); - put("sqlManagementEndpointUrl", sqlManagementEndpoint); - put("sqlServerHostnameSuffix", sqlServerHostnameSuffix); - put("galleryEndpointUrl", galleryEndpoint); - put("activeDirectoryEndpointUrl", activeDirectoryEndpoint); - put("activeDirectoryResourceId", activeDirectoryResourceId); - put("activeDirectoryGraphResourceId", activeDirectoryGraphEndpoint); - put("microsoftGraphResourceId", microsoftGraphEndpoint); - put("dataLakeEndpointResourceId", dataLakeEndpointResourceId); - put("activeDirectoryGraphApiVersion", activeDirectoryGraphApiVersion); - put("storageEndpointSuffix", storageEndpointSuffix); - put("keyVaultDnsSuffix", keyVaultDnsSuffix); - put("azureDataLakeStoreFileSystemEndpointSuffix", azureDataLakeStoreFileSystemEndpointSuffix); - put("azureDataLakeAnalyticsCatalogAndJobEndpointSuffix", azureDataLakeAnalyticsCatalogAndJobEndpointSuffix); - put("azureLogAnalyticsResourceId", azureLogAnalyticsEndpoint); - put("azureApplicationInsightsResourceId", azureApplicationInsightsEndpoint); - } - }; - } - - public String getPortal() { - return portal; - } - - public void setPortal(String portal) { - this.portal = portal; - } - - public String getPublishingProfile() { - return publishingProfile; - } - - public void setPublishingProfile(String publishingProfile) { - this.publishingProfile = publishingProfile; - } - - public String getManagementEndpoint() { - return managementEndpoint; - } - - public void setManagementEndpoint(String managementEndpoint) { - this.managementEndpoint = managementEndpoint; - } - - public String getResourceManagerEndpoint() { - return resourceManagerEndpoint; - } - - public void setResourceManagerEndpoint(String resourceManagerEndpoint) { - this.resourceManagerEndpoint = resourceManagerEndpoint; - } - - public String getSqlManagementEndpoint() { - return sqlManagementEndpoint; - } - - public void setSqlManagementEndpoint(String sqlManagementEndpoint) { - this.sqlManagementEndpoint = sqlManagementEndpoint; - } - - public String getSqlServerHostnameSuffix() { - return sqlServerHostnameSuffix; - } - - public void setSqlServerHostnameSuffix(String sqlServerHostnameSuffix) { - this.sqlServerHostnameSuffix = sqlServerHostnameSuffix; - } - - public String getGalleryEndpoint() { - return galleryEndpoint; - } - - public void setGalleryEndpoint(String galleryEndpoint) { - this.galleryEndpoint = galleryEndpoint; - } - - public String getActiveDirectoryEndpoint() { - return activeDirectoryEndpoint; - } - - public void setActiveDirectoryEndpoint(String activeDirectoryEndpoint) { - this.activeDirectoryEndpoint = activeDirectoryEndpoint; - } - - public String getActiveDirectoryResourceId() { - return activeDirectoryResourceId; - } - - public void setActiveDirectoryResourceId(String activeDirectoryResourceId) { - this.activeDirectoryResourceId = activeDirectoryResourceId; - } - - public String getActiveDirectoryGraphEndpoint() { - return activeDirectoryGraphEndpoint; - } - - public void setActiveDirectoryGraphEndpoint(String activeDirectoryGraphEndpoint) { - this.activeDirectoryGraphEndpoint = activeDirectoryGraphEndpoint; - } - - public String getMicrosoftGraphEndpoint() { - return microsoftGraphEndpoint; - } - - public void setMicrosoftGraphEndpoint(String microsoftGraphEndpoint) { - this.microsoftGraphEndpoint = microsoftGraphEndpoint; - } - - public String getDataLakeEndpointResourceId() { - return dataLakeEndpointResourceId; - } - - public void setDataLakeEndpointResourceId(String dataLakeEndpointResourceId) { - this.dataLakeEndpointResourceId = dataLakeEndpointResourceId; - } - - public String getActiveDirectoryGraphApiVersion() { - return activeDirectoryGraphApiVersion; - } - - public void setActiveDirectoryGraphApiVersion(String activeDirectoryGraphApiVersion) { - this.activeDirectoryGraphApiVersion = activeDirectoryGraphApiVersion; - } - - public String getStorageEndpointSuffix() { - return storageEndpointSuffix; - } - - public void setStorageEndpointSuffix(String storageEndpointSuffix) { - this.storageEndpointSuffix = storageEndpointSuffix; - } - - public String getKeyVaultDnsSuffix() { - return keyVaultDnsSuffix; - } - - public void setKeyVaultDnsSuffix(String keyVaultDnsSuffix) { - this.keyVaultDnsSuffix = keyVaultDnsSuffix; - } - - public String getAzureDataLakeStoreFileSystemEndpointSuffix() { - return azureDataLakeStoreFileSystemEndpointSuffix; - } - - public void setAzureDataLakeStoreFileSystemEndpointSuffix(String azureDataLakeStoreFileSystemEndpointSuffix) { - this.azureDataLakeStoreFileSystemEndpointSuffix = azureDataLakeStoreFileSystemEndpointSuffix; - } - - public String getAzureDataLakeAnalyticsCatalogAndJobEndpointSuffix() { - return azureDataLakeAnalyticsCatalogAndJobEndpointSuffix; - } - - public void setAzureDataLakeAnalyticsCatalogAndJobEndpointSuffix(String azureDataLakeAnalyticsCatalogAndJobEndpointSuffix) { - this.azureDataLakeAnalyticsCatalogAndJobEndpointSuffix = azureDataLakeAnalyticsCatalogAndJobEndpointSuffix; - } - - public String getAzureLogAnalyticsEndpoint() { - return azureLogAnalyticsEndpoint; - } - - public void setAzureLogAnalyticsEndpoint(String azureLogAnalyticsEndpoint) { - this.azureLogAnalyticsEndpoint = azureLogAnalyticsEndpoint; - } - - public String getAzureApplicationInsightsEndpoint() { - return azureApplicationInsightsEndpoint; - } - - 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/proxy/HttpProxyProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/proxy/HttpProxyProperties.java index 49c412b1bec1..3fb8256464df 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 @@ -3,10 +3,13 @@ package com.azure.spring.core.properties.proxy; +import com.azure.spring.core.aware.ProxyAware; + /** * Extend the proxy properties for HTTP connection */ -public class HttpProxyProperties extends ProxyProperties { +public class HttpProxyProperties extends ProxyProperties implements ProxyAware.HttpProxy { + private String nonProxyHosts; public String getNonProxyHosts() { @@ -16,4 +19,5 @@ public String getNonProxyHosts() { public void setNonProxyHosts(String nonProxyHosts) { this.nonProxyHosts = nonProxyHosts; } + } diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/proxy/ProxyProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/proxy/ProxyProperties.java index 32688c582040..b2f053650c76 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/proxy/ProxyProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/proxy/ProxyProperties.java @@ -3,10 +3,12 @@ package com.azure.spring.core.properties.proxy; +import com.azure.spring.core.aware.ProxyAware; + /** * Common proxy properties for all Azure SDKs. */ -public class ProxyProperties { +public class ProxyProperties implements ProxyAware.Proxy { private String type; private String hostname; @@ -15,10 +17,6 @@ public class ProxyProperties { private String username; private String password; - public ProxyProperties() { - - } - public String getType() { return type; } 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 new file mode 100644 index 000000000000..e06c750a6b7e --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/retry/BackoffProperties.java @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.properties.retry; + +import com.azure.spring.core.aware.RetryAware; + +import java.time.Duration; + +/** + * Backoff properties when a retry fails. + */ +public class BackoffProperties implements RetryAware.Backoff { + + private Duration delay; + 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 + */ + 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-core/src/main/java/com/azure/spring/core/properties/retry/HttpRetryProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/retry/HttpRetryProperties.java new file mode 100644 index 000000000000..0b5c43c894d9 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/retry/HttpRetryProperties.java @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.core.properties.retry; + +import com.azure.spring.core.aware.RetryAware; + +import java.time.temporal.ChronoUnit; + +/** + * Unified http retry properties for all Azure SDKs based on HTTP. + */ +public class HttpRetryProperties extends RetryProperties implements RetryAware.HttpRetry { + + 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; + } +} diff --git a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/retry/RetryProperties.java b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/retry/RetryProperties.java index 87fdc55faf26..ce4f0aba38b4 100644 --- a/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/retry/RetryProperties.java +++ b/sdk/spring/spring-cloud-azure-core/src/main/java/com/azure/spring/core/properties/retry/RetryProperties.java @@ -3,21 +3,25 @@ package com.azure.spring.core.properties.retry; +import com.azure.spring.core.aware.RetryAware; + import java.time.Duration; /** * Common retry properties for all Azure SDKs. */ -public class RetryProperties { +public class RetryProperties implements RetryAware.Retry { private final BackoffProperties backoff = new BackoffProperties(); + /** + * The maximum number of attempts + */ private Integer maxAttempts; + /** + * How long to wait until a timeout + */ private Duration timeout; - public RetryProperties() { - - } - public BackoffProperties getBackoff() { return backoff; } @@ -38,47 +42,4 @@ public void setTimeout(Duration timeout) { this.timeout = timeout; } - /** - * Backoff properties when a retry fails. - */ - public static class BackoffProperties { - - private Duration delay; - private Duration maxDelay; - - public BackoffProperties() { - - } - - /** - * 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 - */ - 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-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 ea3a8e70ca07..7518a653bb19 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 @@ -5,8 +5,8 @@ import com.azure.spring.core.properties.AzureProperties; import com.azure.spring.core.properties.AzurePropertiesUtils; +import com.azure.spring.core.properties.authentication.TokenCredentialProperties; import com.azure.spring.core.properties.client.ClientProperties; -import com.azure.spring.core.properties.credential.TokenCredentialProperties; import com.azure.spring.core.properties.profile.AzureProfile; import com.azure.spring.core.properties.proxy.ProxyProperties; import com.azure.spring.core.properties.retry.RetryProperties; @@ -15,8 +15,8 @@ import java.time.Duration; -import static com.azure.spring.core.properties.profile.AzureProfile.AzureEnvironment.AZURE; -import static com.azure.spring.core.properties.profile.AzureProfile.AzureEnvironment.AZURE_CHINA; +import static com.azure.spring.core.properties.profile.AzureEnvironment.AZURE; +import static com.azure.spring.core.properties.profile.AzureEnvironment.AZURE_CHINA; /** * diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/appconfiguration/ConfigurationClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/appconfiguration/ConfigurationClientBuilderFactory.java index 8e48072bbfd1..5a41918e2d5a 100644 --- a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/appconfiguration/ConfigurationClientBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/appconfiguration/ConfigurationClientBuilderFactory.java @@ -8,6 +8,7 @@ import com.azure.core.http.HttpPipeline; import com.azure.core.http.policy.HttpLogOptions; import com.azure.core.http.policy.HttpPipelinePolicy; +import com.azure.core.http.policy.RetryPolicy; import com.azure.core.util.Configuration; import com.azure.data.appconfiguration.ConfigurationClientBuilder; import com.azure.spring.core.credential.descriptor.AuthenticationDescriptor; @@ -91,4 +92,9 @@ protected BiConsumer consumeDefault protected BiConsumer consumeConnectionString() { return ConfigurationClientBuilder::connectionString; } + + @Override + protected BiConsumer consumeRetryPolicy() { + return ConfigurationClientBuilder::retryPolicy; + } } diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/cosmos/CosmosProperties.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/cosmos/CosmosProperties.java index 07176d815e4a..d7b898c4cb98 100644 --- a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/cosmos/CosmosProperties.java +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/cosmos/CosmosProperties.java @@ -9,8 +9,10 @@ import com.azure.cosmos.GatewayConnectionConfig; import com.azure.cosmos.ThrottlingRetryOptions; import com.azure.cosmos.models.CosmosPermissionProperties; +import com.azure.spring.core.aware.RetryAware; +import com.azure.spring.core.aware.authentication.KeyAware; import com.azure.spring.core.properties.AzureProperties; -import com.azure.spring.core.properties.aware.credential.KeyAware; +import com.azure.spring.core.properties.retry.RetryProperties; import java.util.List; @@ -52,4 +54,9 @@ public interface CosmosProperties extends AzureProperties, KeyAware { ConnectionMode getConnectionMode(); ThrottlingRetryOptions getThrottlingRetryOptions(); + + @Override + default RetryAware.Retry getRetry() { + return new RetryProperties(); + } } diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/eventhubs/properties/EventHubCommonDescriptor.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/eventhubs/properties/EventHubCommonDescriptor.java index f05f4aeae8c3..2ed3c607fc77 100644 --- a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/eventhubs/properties/EventHubCommonDescriptor.java +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/eventhubs/properties/EventHubCommonDescriptor.java @@ -4,7 +4,7 @@ package com.azure.spring.service.eventhubs.properties; import com.azure.spring.core.properties.AzureProperties; -import com.azure.spring.core.properties.aware.credential.ConnectionStringAware; +import com.azure.spring.core.aware.authentication.ConnectionStringAware; /** * Azure Event Hub common related properties. diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/keyvault/certificates/CertificateClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/keyvault/certificates/CertificateClientBuilderFactory.java index 6e91fb3e8b82..de1c640d8d86 100644 --- a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/keyvault/certificates/CertificateClientBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/keyvault/certificates/CertificateClientBuilderFactory.java @@ -8,6 +8,7 @@ import com.azure.core.http.HttpPipeline; import com.azure.core.http.policy.HttpLogOptions; import com.azure.core.http.policy.HttpPipelinePolicy; +import com.azure.core.http.policy.RetryPolicy; import com.azure.core.util.Configuration; import com.azure.security.keyvault.certificates.CertificateClientBuilder; import com.azure.spring.core.credential.descriptor.AuthenticationDescriptor; @@ -95,4 +96,9 @@ protected BiConsumer consumeConnectionString() LOGGER.debug("Connection string is not supported to configure in CertificateClientBuilder"); return (a, b) -> { }; } + + @Override + protected BiConsumer consumeRetryPolicy() { + return CertificateClientBuilder::retryPolicy; + } } diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/keyvault/secrets/SecretClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/keyvault/secrets/SecretClientBuilderFactory.java index a35adb61f8f8..4e59d8c7a70f 100644 --- a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/keyvault/secrets/SecretClientBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/keyvault/secrets/SecretClientBuilderFactory.java @@ -8,6 +8,7 @@ import com.azure.core.http.HttpPipeline; import com.azure.core.http.policy.HttpLogOptions; import com.azure.core.http.policy.HttpPipelinePolicy; +import com.azure.core.http.policy.RetryPolicy; import com.azure.core.util.Configuration; import com.azure.security.keyvault.secrets.SecretClientBuilder; import com.azure.spring.core.credential.descriptor.AuthenticationDescriptor; @@ -94,4 +95,8 @@ protected BiConsumer consumeConnectionString() { return (a, b) -> { }; } + @Override + protected BiConsumer consumeRetryPolicy() { + return SecretClientBuilder::retryPolicy; + } } diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/blob/BlobServiceClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/blob/BlobServiceClientBuilderFactory.java index b9e7f854ecee..3cd68535b2a0 100644 --- a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/blob/BlobServiceClientBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/blob/BlobServiceClientBuilderFactory.java @@ -12,12 +12,13 @@ import com.azure.spring.core.credential.descriptor.AuthenticationDescriptor; import com.azure.spring.core.credential.descriptor.SasAuthenticationDescriptor; import com.azure.spring.core.credential.descriptor.TokenAuthenticationDescriptor; -import com.azure.spring.core.factory.AbstractAzureHttpClientBuilderFactory; import com.azure.spring.core.properties.AzureProperties; import com.azure.spring.service.core.PropertyMapper; +import com.azure.spring.service.storage.common.AbstractAzureStorageClientBuilderFactory; import com.azure.spring.service.storage.common.credential.StorageSharedKeyAuthenticationDescriptor; import com.azure.storage.blob.BlobServiceClientBuilder; import com.azure.storage.blob.models.CustomerProvidedKey; +import com.azure.storage.common.policy.RequestRetryOptions; import java.util.Arrays; import java.util.List; @@ -30,7 +31,7 @@ * Storage Blob Service client builder factory, it builds the storage blob client according the configuration context * and blob properties. */ -public class BlobServiceClientBuilderFactory extends AbstractAzureHttpClientBuilderFactory { +public class BlobServiceClientBuilderFactory extends AbstractAzureStorageClientBuilderFactory { private final StorageBlobProperties blobProperties; @@ -38,7 +39,6 @@ public BlobServiceClientBuilderFactory(StorageBlobProperties blobProperties) { this.blobProperties = blobProperties; } - @Override public BlobServiceClientBuilder createBuilderInstance() { return new BlobServiceClientBuilder(); @@ -106,4 +106,9 @@ protected List> getAuthenticationDescriptors(BlobSer protected String getApplicationId() { return AZURE_SPRING_STORAGE_BLOB + VERSION; } + + @Override + protected BiConsumer consumeRequestRetryOptions() { + return BlobServiceClientBuilder::retryOptions; + } } diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/AbstractAzureStorageClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/AbstractAzureStorageClientBuilderFactory.java new file mode 100644 index 000000000000..99fe5ccbf3b1 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/AbstractAzureStorageClientBuilderFactory.java @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.storage.common; + +import com.azure.core.http.policy.RetryPolicy; +import com.azure.spring.core.aware.RetryAware; +import com.azure.spring.core.factory.AbstractAzureHttpClientBuilderFactory; +import com.azure.storage.common.policy.RequestRetryOptions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.function.BiConsumer; + +import static com.azure.spring.service.storage.common.AzureStorageRetryOptionsConverter.STORAGE_RETRY_CONVERTER; + +/** + * Abstract factory for Storage client builder. + * @param Storage service builder + */ +public abstract class AbstractAzureStorageClientBuilderFactory extends AbstractAzureHttpClientBuilderFactory { + + private static final Logger LOGGER = LoggerFactory.getLogger(AbstractAzureStorageClientBuilderFactory.class); + protected abstract BiConsumer consumeRequestRetryOptions(); + + @Override + protected void configureRetry(T builder) { + RetryAware.Retry retry = getAzureProperties().getRetry(); + if (retry instanceof StorageRetry) { + RequestRetryOptions requestRetryOptions = STORAGE_RETRY_CONVERTER.convert((StorageRetry) retry); + consumeRequestRetryOptions().accept(builder, requestRetryOptions); + } else { + LOGGER.warn("The retry in a storage client builder is of type {}", retry.getClass().getName()); + } + } + + @Override + protected BiConsumer consumeRetryPolicy() { + return (a, b) -> { }; + } +} diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/AzureStorageRetryOptionsConverter.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/AzureStorageRetryOptionsConverter.java new file mode 100644 index 000000000000..46e11cac3193 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/AzureStorageRetryOptionsConverter.java @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.storage.common; + +import com.azure.spring.core.aware.RetryAware; +import com.azure.storage.common.policy.RequestRetryOptions; +import com.azure.storage.common.policy.RetryPolicyType; +import org.springframework.core.convert.converter.Converter; +import org.springframework.lang.NonNull; + +import java.time.Duration; + +/** + * Converts a {@link StorageRetry} to a {@link RequestRetryOptions}. + */ +public final class AzureStorageRetryOptionsConverter implements Converter { + + public static final AzureStorageRetryOptionsConverter STORAGE_RETRY_CONVERTER = new AzureStorageRetryOptionsConverter(); + + @Override + public RequestRetryOptions convert(@NonNull StorageRetry storageRetry) { + RetryPolicyType retryPolicyType = null; + Duration delay = null; + Duration maxDelay = null; + final RetryAware.Backoff backoff = storageRetry.getBackoff(); + if (backoff != null) { + if (backoff.getMultiplier() != null && backoff.getMultiplier() > 0) { + retryPolicyType = RetryPolicyType.EXPONENTIAL; + } else { + retryPolicyType = RetryPolicyType.FIXED; + } + delay = backoff.getDelay(); + maxDelay = backoff.getMaxDelay(); + } + return new RequestRetryOptions(retryPolicyType, storageRetry.getMaxAttempts(), + storageRetry.getTimeout(), delay, maxDelay, storageRetry.getSecondaryHost()); + } +} diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/StorageProperties.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/StorageProperties.java index 6ef5dd935da3..614632471e07 100644 --- a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/StorageProperties.java +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/StorageProperties.java @@ -4,7 +4,7 @@ package com.azure.spring.service.storage.common; import com.azure.spring.core.properties.AzureProperties; -import com.azure.spring.core.properties.aware.credential.SasTokenAware; +import com.azure.spring.core.aware.authentication.SasTokenAware; /** * Common properties for all Azure Storage services. diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/StorageRetry.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/StorageRetry.java new file mode 100644 index 000000000000..32d620ff8796 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/StorageRetry.java @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.storage.common; + +import com.azure.spring.core.aware.RetryAware; + +/** + * Interface to be implemented by classes that wish to describe storage sdks related retry operations. + */ +public interface StorageRetry extends RetryAware.HttpRetry { + + String getSecondaryHost(); +} diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/StorageRetryProperties.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/StorageRetryProperties.java new file mode 100644 index 000000000000..2ee2adbd166e --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/common/StorageRetryProperties.java @@ -0,0 +1,22 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.storage.common; + +import com.azure.spring.core.properties.retry.HttpRetryProperties; + +/** + * + */ +public class StorageRetryProperties extends HttpRetryProperties implements StorageRetry { + + private String secondaryHost; + + public String getSecondaryHost() { + return secondaryHost; + } + + public void setSecondaryHost(String secondaryHost) { + this.secondaryHost = secondaryHost; + } +} diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/fileshare/ShareServiceClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/fileshare/ShareServiceClientBuilderFactory.java index b532fd05cf33..361a0e3847f2 100644 --- a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/fileshare/ShareServiceClientBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/fileshare/ShareServiceClientBuilderFactory.java @@ -11,10 +11,11 @@ import com.azure.core.util.Configuration; import com.azure.spring.core.credential.descriptor.AuthenticationDescriptor; import com.azure.spring.core.credential.descriptor.SasAuthenticationDescriptor; -import com.azure.spring.core.factory.AbstractAzureHttpClientBuilderFactory; import com.azure.spring.core.properties.AzureProperties; import com.azure.spring.service.core.PropertyMapper; +import com.azure.spring.service.storage.common.AbstractAzureStorageClientBuilderFactory; import com.azure.spring.service.storage.common.credential.StorageSharedKeyAuthenticationDescriptor; +import com.azure.storage.common.policy.RequestRetryOptions; import com.azure.storage.file.share.ShareServiceClientBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,7 +31,7 @@ * Storage File Share Service client builder factory, it builds the storage blob client according the configuration * context and blob properties. */ -public class ShareServiceClientBuilderFactory extends AbstractAzureHttpClientBuilderFactory { +public class ShareServiceClientBuilderFactory extends AbstractAzureStorageClientBuilderFactory { private static final Logger LOGGER = LoggerFactory.getLogger(ShareServiceClientBuilderFactory.class); @@ -105,4 +106,9 @@ protected BiConsumer consumeConnectionString( protected String getApplicationId() { return AZURE_SPRING_STORAGE_FILES + VERSION; } + + @Override + protected BiConsumer consumeRequestRetryOptions() { + return ShareServiceClientBuilder::retryOptions; + } } diff --git a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/queue/QueueServiceClientBuilderFactory.java b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/queue/QueueServiceClientBuilderFactory.java index 5b39a092b444..46cd5d5a81d8 100644 --- a/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/queue/QueueServiceClientBuilderFactory.java +++ b/sdk/spring/spring-cloud-azure-service/src/main/java/com/azure/spring/service/storage/queue/QueueServiceClientBuilderFactory.java @@ -12,10 +12,11 @@ import com.azure.spring.core.credential.descriptor.AuthenticationDescriptor; import com.azure.spring.core.credential.descriptor.SasAuthenticationDescriptor; import com.azure.spring.core.credential.descriptor.TokenAuthenticationDescriptor; -import com.azure.spring.core.factory.AbstractAzureHttpClientBuilderFactory; import com.azure.spring.core.properties.AzureProperties; import com.azure.spring.service.core.PropertyMapper; +import com.azure.spring.service.storage.common.AbstractAzureStorageClientBuilderFactory; import com.azure.spring.service.storage.common.credential.StorageSharedKeyAuthenticationDescriptor; +import com.azure.storage.common.policy.RequestRetryOptions; import com.azure.storage.queue.QueueMessageEncoding; import com.azure.storage.queue.QueueServiceClientBuilder; @@ -30,7 +31,7 @@ * Storage Queue Service client builder factory, it builds the storage blob client according the configuration context * and blob properties. */ -public class QueueServiceClientBuilderFactory extends AbstractAzureHttpClientBuilderFactory { +public class QueueServiceClientBuilderFactory extends AbstractAzureStorageClientBuilderFactory { private final StorageQueueProperties queueProperties; @@ -109,4 +110,9 @@ private QueueMessageEncoding convertToMessageEncoding(String messageEncoding) { .name() .equalsIgnoreCase(messageEncoding) ? QueueMessageEncoding.BASE64 : QueueMessageEncoding.NONE; } + + @Override + protected BiConsumer consumeRequestRetryOptions() { + return QueueServiceClientBuilder::retryOptions; + } } diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/core/properties/AbstractAmqpProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/core/properties/AbstractAmqpProperties.java new file mode 100644 index 000000000000..1dbf5615e4a1 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/core/properties/AbstractAmqpProperties.java @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.core.properties; + +import com.azure.spring.core.properties.client.AmqpClientProperties; +import com.azure.spring.core.properties.client.ClientProperties; +import com.azure.spring.core.properties.proxy.ProxyProperties; +import com.azure.spring.core.properties.retry.RetryProperties; + +public abstract class AbstractAmqpProperties extends AbstractServiceProperties { + + public AbstractAmqpProperties() { + this.proxy = new ProxyProperties(); + this.retry = new RetryProperties(); + this.client = new AmqpClientProperties(); + } + @Override + public ClientProperties getClient() { + return client; + } + + @Override + public ProxyProperties getProxy() { + return this.proxy; + } + + @Override + public RetryProperties getRetry() { + return this.retry; + } +} diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/core/properties/AbstractHttpProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/core/properties/AbstractHttpProperties.java new file mode 100644 index 000000000000..fdf61b24f2a1 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/core/properties/AbstractHttpProperties.java @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.core.properties; + +import com.azure.spring.core.properties.client.ClientProperties; +import com.azure.spring.core.properties.client.HttpClientProperties; +import com.azure.spring.core.properties.proxy.HttpProxyProperties; +import com.azure.spring.core.properties.proxy.ProxyProperties; +import com.azure.spring.core.properties.retry.HttpRetryProperties; +import com.azure.spring.core.properties.retry.RetryProperties; + +public abstract class AbstractHttpProperties extends AbstractServiceProperties { + + public AbstractHttpProperties() { + this.proxy = new HttpProxyProperties(); + this.retry = new HttpRetryProperties(); + this.client = new HttpClientProperties(); + } + @Override + public ClientProperties getClient() { + return client; + } + + @Override + public ProxyProperties getProxy() { + return this.proxy; + } + + @Override + public RetryProperties getRetry() { + return this.retry; + } +} diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/core/properties/AbstractServiceProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/core/properties/AbstractServiceProperties.java new file mode 100644 index 000000000000..b52693777434 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/core/properties/AbstractServiceProperties.java @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.core.properties; + +import com.azure.spring.core.properties.AzureProperties; +import com.azure.spring.core.properties.client.ClientProperties; +import com.azure.spring.core.properties.authentication.TokenCredentialProperties; +import com.azure.spring.core.properties.profile.AzureProfile; +import com.azure.spring.core.properties.proxy.ProxyProperties; +import com.azure.spring.core.properties.retry.RetryProperties; + +/** + * Configuration properties base class for all Azure clients. + */ +abstract class AbstractServiceProperties implements AzureProperties { + + protected final TokenCredentialProperties credential = new TokenCredentialProperties(); + + protected final AzureProfile profile = new AzureProfile(); + + protected RetryProperties retry; + + protected ProxyProperties proxy; + + protected ClientProperties client; + + @Override + public TokenCredentialProperties getCredential() { + return credential; + } + + @Override + public AzureProfile getProfile() { + return profile; + } + +} diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/core/properties/TestAzureProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/core/properties/TestAzureProperties.java deleted file mode 100644 index 51bf19c4520e..000000000000 --- a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/core/properties/TestAzureProperties.java +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.service.core.properties; - -import com.azure.spring.core.properties.AzureProperties; -import com.azure.spring.core.properties.client.ClientProperties; -import com.azure.spring.core.properties.credential.TokenCredentialProperties; -import com.azure.spring.core.properties.profile.AzureProfile; -import com.azure.spring.core.properties.proxy.ProxyProperties; -import com.azure.spring.core.properties.retry.RetryProperties; - -public class TestAzureProperties implements AzureProperties { - - private final ClientProperties client = new ClientProperties(); - private final ProxyProperties proxy = new ProxyProperties(); - private final RetryProperties retry = new RetryProperties(); - private final TokenCredentialProperties credential = new TokenCredentialProperties(); - private final AzureProfile profile = new AzureProfile(); - - @Override - public ClientProperties getClient() { - return client; - } - - @Override - public ProxyProperties getProxy() { - return proxy; - } - - @Override - public RetryProperties getRetry() { - return retry; - } - - @Override - public TokenCredentialProperties getCredential() { - return credential; - } - - @Override - public AzureProfile getProfile() { - return profile; - } -} diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/cosmos/CosmosClientBuilderFactoryTest.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/cosmos/CosmosClientBuilderFactoryTest.java index 80e68acc57f7..5299d3dbf458 100644 --- a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/cosmos/CosmosClientBuilderFactoryTest.java +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/cosmos/CosmosClientBuilderFactoryTest.java @@ -7,22 +7,26 @@ import com.azure.cosmos.CosmosClientBuilder; import com.azure.cosmos.DirectConnectionConfig; import com.azure.cosmos.GatewayConnectionConfig; +import com.azure.cosmos.ThrottlingRetryOptions; +import com.azure.spring.core.properties.retry.RetryProperties; import com.azure.spring.service.AzureServiceClientBuilderFactoryTestBase; import org.junit.jupiter.api.Test; +import java.time.Duration; + import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; public class CosmosClientBuilderFactoryTest extends AzureServiceClientBuilderFactoryTestBase { + TestAzureCosmosHttpProperties, CosmosClientBuilderFactory> { private static final String ENDPOINT = "https://test.documents.azure.com:443/"; @Test void testGatewayConnectionModeConfigured() { - TestAzureCosmosProperties properties = createMinimalServiceProperties(); + TestAzureCosmosHttpProperties properties = createMinimalServiceProperties(); properties.setConnectionMode(ConnectionMode.GATEWAY); final CosmosClientBuilderFactoryExt factoryExt = new CosmosClientBuilderFactoryExt(properties); final CosmosClientBuilder builder = factoryExt.build(); @@ -32,7 +36,7 @@ void testGatewayConnectionModeConfigured() { @Test void testDirectConnectionModeConfigured() { - TestAzureCosmosProperties properties = createMinimalServiceProperties(); + TestAzureCosmosHttpProperties properties = createMinimalServiceProperties(); properties.setConnectionMode(ConnectionMode.DIRECT); final CosmosClientBuilderFactoryExt factoryExt = new CosmosClientBuilderFactoryExt(properties); final CosmosClientBuilder builder = factoryExt.build(); @@ -40,16 +44,26 @@ void testDirectConnectionModeConfigured() { verify(builder, times(1)).directMode(any(DirectConnectionConfig.class), any(GatewayConnectionConfig.class)); } + @Test + void testThrottlingRetryOptionsConfiguredRetry() { + TestAzureCosmosHttpProperties properties = createMinimalServiceProperties(); + RetryProperties retryProperties = properties.getRetry(); + retryProperties.setTimeout(Duration.ofMillis(1000)); + final CosmosClientBuilderFactoryExt factoryExt = new CosmosClientBuilderFactoryExt(properties); + final CosmosClientBuilder builder = factoryExt.build(); + verify(builder, times(1)).throttlingRetryOptions(any(ThrottlingRetryOptions.class)); + } + @Override - protected TestAzureCosmosProperties createMinimalServiceProperties() { - TestAzureCosmosProperties cosmosProperties = new TestAzureCosmosProperties(); + protected TestAzureCosmosHttpProperties createMinimalServiceProperties() { + TestAzureCosmosHttpProperties cosmosProperties = new TestAzureCosmosHttpProperties(); cosmosProperties.setEndpoint(ENDPOINT); return cosmosProperties; } static class CosmosClientBuilderFactoryExt extends CosmosClientBuilderFactory { - CosmosClientBuilderFactoryExt(TestAzureCosmosProperties cosmosProperties) { + CosmosClientBuilderFactoryExt(TestAzureCosmosHttpProperties cosmosProperties) { super(cosmosProperties); } diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/cosmos/TestAzureCosmosProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/cosmos/TestAzureCosmosHttpProperties.java similarity index 89% rename from sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/cosmos/TestAzureCosmosProperties.java rename to sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/cosmos/TestAzureCosmosHttpProperties.java index 36f72e1eee7d..bd834db3d607 100644 --- a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/cosmos/TestAzureCosmosProperties.java +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/cosmos/TestAzureCosmosHttpProperties.java @@ -5,13 +5,11 @@ import com.azure.cosmos.ConnectionMode; import com.azure.cosmos.ConsistencyLevel; +import com.azure.cosmos.DirectConnectionConfig; import com.azure.cosmos.GatewayConnectionConfig; import com.azure.cosmos.ThrottlingRetryOptions; -import com.azure.cosmos.DirectConnectionConfig; import com.azure.cosmos.models.CosmosPermissionProperties; -import com.azure.spring.core.properties.client.ClientProperties; -import com.azure.spring.core.properties.proxy.HttpProxyProperties; -import com.azure.spring.service.core.properties.TestAzureProperties; +import com.azure.spring.service.core.properties.AbstractHttpProperties; import org.springframework.validation.annotation.Validated; import java.util.ArrayList; @@ -21,11 +19,7 @@ * Configuration properties for Cosmos database, consistency, telemetry, connection, query metrics and diagnostics. */ @Validated -public class TestAzureCosmosProperties extends TestAzureProperties implements CosmosProperties { - - public static final String PREFIX = "spring.cloud.azure.cosmos"; - - private final HttpProxyProperties proxy = new HttpProxyProperties(); +public class TestAzureCosmosHttpProperties extends AbstractHttpProperties implements CosmosProperties { private String endpoint; @@ -62,16 +56,6 @@ public class TestAzureCosmosProperties extends TestAzureProperties implements Co */ private boolean populateQueryMetrics; - @Override - public HttpProxyProperties getProxy() { - return proxy; - } - - @Override - public ClientProperties getClient() { - return new ClientProperties(); - } - public String getEndpoint() { return endpoint; } @@ -85,7 +69,6 @@ public String getKey() { return key; } - @Override public void setKey(String key) { this.key = key; } diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/eventhubs/EventHubClientBuilderFactoryTest.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/eventhubs/EventHubClientBuilderFactoryTest.java new file mode 100644 index 000000000000..7e3bf0e44f07 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/eventhubs/EventHubClientBuilderFactoryTest.java @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.eventhubs; + +import com.azure.core.amqp.AmqpRetryOptions; +import com.azure.messaging.eventhubs.EventHubClientBuilder; +import com.azure.messaging.eventhubs.EventHubConsumerClient; +import com.azure.spring.service.AzureServiceClientBuilderFactoryTestBase; +import com.azure.spring.service.eventhubs.factory.EventHubClientBuilderFactory; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class EventHubClientBuilderFactoryTest extends AzureServiceClientBuilderFactoryTestBase { + + @Override + protected TestAzureEventHubProperties createMinimalServiceProperties() { + TestAzureEventHubProperties testAzureEventHubProperties = new TestAzureEventHubProperties(); + return testAzureEventHubProperties; + } + + @Test + void testRetryOptionsConfigured() { + ArrayList list = new ArrayList<>(); + + TestAzureEventHubProperties properties = createMinimalServiceProperties(); + final EventHubClientBuilderFactoryExt builderFactory = new EventHubClientBuilderFactoryExt(properties); + final EventHubClientBuilder builder = builderFactory.build(); + final EventHubConsumerClient client = builder.buildConsumerClient(); + verify(builder, times(1)).retry(any(AmqpRetryOptions.class)); + } + + static class EventHubClientBuilderFactoryExt extends EventHubClientBuilderFactory { + + EventHubClientBuilderFactoryExt(TestAzureEventHubProperties properties) { + super(properties); + } + + @Override + public EventHubClientBuilder createBuilderInstance() { + return mock(EventHubClientBuilder.class); + } + } +} diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/eventhubs/TestAzureEventHubCommonProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/eventhubs/TestAzureEventHubCommonProperties.java new file mode 100644 index 000000000000..8c908ebd3792 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/eventhubs/TestAzureEventHubCommonProperties.java @@ -0,0 +1,92 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.eventhubs; + +import com.azure.spring.core.connectionstring.implementation.EventHubConnectionString; +import com.azure.spring.service.core.properties.AbstractAmqpProperties; + +/** + * Azure Event Hub related properties. + */ +public abstract class TestAzureEventHubCommonProperties extends AbstractAmqpProperties { + + protected String domainName = "servicebus.windows.net"; + protected String namespace; + protected String eventHubName; + protected String connectionString; + protected String customEndpointAddress; + protected Integer prefetchCount; + + protected String extractFqdnFromConnectionString() { + if (this.connectionString == null) { + return null; + } + return new EventHubConnectionString(this.connectionString).getFullyQualifiedNamespace(); + } + + protected String extractEventHubNameFromConnectionString() { + if (this.connectionString == null) { + return null; + } + return new EventHubConnectionString(this.connectionString).getEntityPath(); + } + + + // FQDN = the FQDN of the EventHubs namespace you created (it includes the EventHubs namespace name followed by + // servicebus.windows.net) + // Endpoint=sb:///;SharedAccessKeyName=;SharedAccessKey= + // https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-get-connection-string + public String getFQDN() { + return this.namespace == null ? extractFqdnFromConnectionString() : (this.namespace + "." + domainName); + } + + public String getDomainName() { + return domainName; + } + + public void setDomainName(String domainName) { + this.domainName = domainName; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public String getEventHubName() { + return eventHubName == null ? extractEventHubNameFromConnectionString() : eventHubName; + } + + public void setEventHubName(String eventHubName) { + this.eventHubName = eventHubName; + } + + public String getConnectionString() { + return connectionString; + } + + public void setConnectionString(String connectionString) { + this.connectionString = connectionString; + } + + public String getCustomEndpointAddress() { + return customEndpointAddress; + } + + public void setCustomEndpointAddress(String customEndpointAddress) { + this.customEndpointAddress = customEndpointAddress; + } + + public Integer getPrefetchCount() { + return prefetchCount; + } + + public void setPrefetchCount(Integer prefetchCount) { + this.prefetchCount = prefetchCount; + } + +} diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/eventhubs/TestAzureEventHubConsumerProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/eventhubs/TestAzureEventHubConsumerProperties.java new file mode 100644 index 000000000000..89a012307e33 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/eventhubs/TestAzureEventHubConsumerProperties.java @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.eventhubs; + +/** + * Azure Event Hub related properties. + */ +public abstract class TestAzureEventHubConsumerProperties extends TestAzureEventHubCommonProperties { + + protected String consumerGroup; + + public String getConsumerGroup() { + return consumerGroup; + } + + public void setConsumerGroup(String consumerGroup) { + this.consumerGroup = consumerGroup; + } +} diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/eventhubs/TestAzureEventHubProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/eventhubs/TestAzureEventHubProperties.java new file mode 100644 index 000000000000..ac08f7d7036a --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/eventhubs/TestAzureEventHubProperties.java @@ -0,0 +1,118 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.eventhubs; + +import com.azure.spring.service.eventhubs.properties.EventHubConsumerDescriptor; +import com.azure.spring.service.eventhubs.properties.EventHubNamespaceDescriptor; +import com.azure.spring.service.eventhubs.properties.EventHubProcessorDescriptor; +import com.azure.spring.service.eventhubs.properties.EventHubProducerDescriptor; +import com.azure.spring.service.storage.blob.TestAzureStorageBlobProperties; + +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +/** + * Azure Event Hub related properties. + */ +public class TestAzureEventHubProperties extends TestAzureEventHubCommonProperties implements EventHubNamespaceDescriptor { + + private Boolean isSharedConnection; + private final Producer producer = new Producer(); + private final Consumer consumer = new Consumer(); + private final Processor processor = new Processor(); + + public Boolean getSharedConnection() { + return isSharedConnection; + } + + public void setSharedConnection(Boolean sharedConnection) { + isSharedConnection = sharedConnection; + } + + public Producer getProducer() { + return producer; + } + + public Consumer getConsumer() { + return consumer; + } + + public Processor getProcessor() { + return processor; + } + + /** + * Properties of an Event Hub producer. + */ + public static class Producer extends TestAzureEventHubCommonProperties implements EventHubProducerDescriptor { + + } + + /** + * Properties of an Event Hub consumer. + */ + public static class Consumer extends TestAzureEventHubConsumerProperties implements EventHubConsumerDescriptor { + + } + + /** + * Properties of an Event Hub processor. + */ + public static class Processor extends TestAzureEventHubConsumerProperties implements EventHubProcessorDescriptor { + + private Boolean trackLastEnqueuedEventProperties; + private Map initialPartitionEventPosition = new HashMap<>(); + private Duration partitionOwnershipExpirationInterval; + private final Batch batch = new Batch(); + private final LoadBalancing loadBalancing = new LoadBalancing(); + private final BlobCheckpointStore checkpointStore = new BlobCheckpointStore(); + + public Boolean getTrackLastEnqueuedEventProperties() { + return trackLastEnqueuedEventProperties; + } + + public void setTrackLastEnqueuedEventProperties(Boolean trackLastEnqueuedEventProperties) { + this.trackLastEnqueuedEventProperties = trackLastEnqueuedEventProperties; + } + + public Map getInitialPartitionEventPosition() { + return initialPartitionEventPosition; + } + + public void setInitialPartitionEventPosition(Map initialPartitionEventPosition) { + this.initialPartitionEventPosition = initialPartitionEventPosition; + } + + public Duration getPartitionOwnershipExpirationInterval() { + return partitionOwnershipExpirationInterval; + } + + public void setPartitionOwnershipExpirationInterval(Duration partitionOwnershipExpirationInterval) { + this.partitionOwnershipExpirationInterval = partitionOwnershipExpirationInterval; + } + + public Batch getBatch() { + return batch; + } + + public LoadBalancing getLoadBalancing() { + return loadBalancing; + } + + public BlobCheckpointStore getCheckpointStore() { + return checkpointStore; + } + + /** + * Blob checkpoint store. + */ + public static class BlobCheckpointStore extends TestAzureStorageBlobProperties { + + + } + } + + +} diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/TestAzureStorageProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/TestAzureStorageProperties.java new file mode 100644 index 000000000000..7f65873dc09f --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/TestAzureStorageProperties.java @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.storage; + +import com.azure.spring.service.core.properties.AbstractHttpProperties; +import com.azure.spring.service.storage.common.StorageRetryProperties; + +public abstract class TestAzureStorageProperties extends AbstractHttpProperties { + + protected String endpoint; + protected String accountKey; + protected String sasToken; + protected String connectionString; + protected String accountName; + + private final StorageRetryProperties retry = new StorageRetryProperties(); + + public String getEndpoint() { + return endpoint; + } + + public void setEndpoint(String endpoint) { + this.endpoint = endpoint; + } + + public String getAccountKey() { + return accountKey; + } + + public void setAccountKey(String accountKey) { + this.accountKey = accountKey; + } + + public String getSasToken() { + return sasToken; + } + + public void setSasToken(String sasToken) { + this.sasToken = sasToken; + } + + public String getConnectionString() { + return connectionString; + } + + public void setConnectionString(String connectionString) { + this.connectionString = connectionString; + } + + public String getAccountName() { + return accountName; + } + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + @Override + public StorageRetryProperties getRetry() { + return retry; + } +} diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/blob/AzureBlobClientBuilderFactoryTest.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/blob/AzureBlobClientBuilderFactoryTest.java index d0b517b5c588..9a3f61395941 100644 --- a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/blob/AzureBlobClientBuilderFactoryTest.java +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/blob/AzureBlobClientBuilderFactoryTest.java @@ -8,15 +8,16 @@ import com.azure.core.util.HttpClientOptions; import com.azure.identity.ClientCertificateCredential; import com.azure.identity.ClientSecretCredential; +import com.azure.spring.core.http.DefaultHttpProvider; +import com.azure.spring.core.properties.proxy.ProxyProperties; import com.azure.spring.service.AzureServiceClientBuilderFactoryTestBase; import com.azure.spring.service.core.http.TestHttpClient; import com.azure.spring.service.core.http.TestHttpClientProvider; import com.azure.spring.service.core.http.TestPerCallHttpPipelinePolicy; import com.azure.spring.service.core.http.TestPerRetryHttpPipelinePolicy; -import com.azure.spring.core.http.DefaultHttpProvider; -import com.azure.spring.core.properties.proxy.ProxyProperties; import com.azure.storage.blob.BlobServiceClient; import com.azure.storage.blob.BlobServiceClientBuilder; +import com.azure.storage.common.policy.RequestRetryOptions; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,7 +29,7 @@ import static org.mockito.Mockito.when; /** - * @author Xiaolu Dai, 2021/8/25. + * */ class AzureBlobClientBuilderFactoryTest extends AzureServiceClientBuilderFactoryTestBase { @@ -118,6 +119,15 @@ void testProxyPropertiesConfigured() { verify(defaultHttpClientProvider, times(1)).createInstance(any(HttpClientOptions.class)); } + @Test + void testRetryOptionsConfigured() { + TestAzureStorageBlobProperties properties = createMinimalServiceProperties(); + final BlobServiceClientBuilderFactoryExt builderFactory = new BlobServiceClientBuilderFactoryExt(properties); + final BlobServiceClientBuilder builder = builderFactory.build(); + final BlobServiceClient client = builder.buildClient(); + verify(builder, times(1)).retryOptions(any(RequestRetryOptions.class)); + } + @Override protected TestAzureStorageBlobProperties createMinimalServiceProperties() { TestAzureStorageBlobProperties properties = new TestAzureStorageBlobProperties(); diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/blob/TestAzureStorageBlobProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/blob/TestAzureStorageBlobProperties.java index 8f9e7935f64f..09eba818d342 100644 --- a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/blob/TestAzureStorageBlobProperties.java +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/blob/TestAzureStorageBlobProperties.java @@ -3,22 +3,16 @@ package com.azure.spring.service.storage.blob; -import com.azure.spring.service.core.properties.TestAzureProperties; +import com.azure.spring.service.storage.TestAzureStorageProperties; import com.azure.storage.blob.BlobServiceVersion; -class TestAzureStorageBlobProperties extends TestAzureProperties implements StorageBlobProperties { - +public class TestAzureStorageBlobProperties extends TestAzureStorageProperties implements StorageBlobProperties { private String customerProvidedKey; private String encryptionScope; private BlobServiceVersion serviceVersion; private String containerName; private String blobName; - private String endpoint; - private String accountKey; - private String sasToken; - private String connectionString; - private String accountName; @Override public String getCustomerProvidedKey() { @@ -64,50 +58,4 @@ public String getBlobName() { public void setBlobName(String blobName) { this.blobName = blobName; } - - @Override - public String getEndpoint() { - return endpoint; - } - - public void setEndpoint(String endpoint) { - this.endpoint = endpoint; - } - - @Override - public String getAccountKey() { - return accountKey; - } - - public void setAccountKey(String accountKey) { - this.accountKey = accountKey; - } - - @Override - public String getSasToken() { - return sasToken; - } - - @Override - public void setSasToken(String sasToken) { - this.sasToken = sasToken; - } - - @Override - public String getConnectionString() { - return connectionString; - } - - public void setConnectionString(String connectionString) { - this.connectionString = connectionString; - } - - @Override - public String getAccountName() { - return accountName; - } - - public void setAccountName(String accountName) { - this.accountName = accountName; - } } diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/fileshare/AzureStorageFileShareClientBuilderFactoryTest.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/fileshare/AzureStorageFileShareClientBuilderFactoryTest.java index ee1f9fb5aa7b..354cae2148f5 100644 --- a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/fileshare/AzureStorageFileShareClientBuilderFactoryTest.java +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/fileshare/AzureStorageFileShareClientBuilderFactoryTest.java @@ -15,6 +15,7 @@ import com.azure.spring.service.core.http.TestPerCallHttpPipelinePolicy; import com.azure.spring.service.core.http.TestPerRetryHttpPipelinePolicy; import com.azure.storage.common.StorageSharedKeyCredential; +import com.azure.storage.common.policy.RequestRetryOptions; import com.azure.storage.file.share.ShareServiceClient; import com.azure.storage.file.share.ShareServiceClientBuilder; import org.junit.jupiter.api.Test; @@ -93,7 +94,8 @@ void testProxyPropertiesConfigured() { proxyProperties.setHostname("localhost"); proxyProperties.setPort(8080); - final ShareServiceClientBuilderFactoryProxyExt builderFactory = new ShareServiceClientBuilderFactoryProxyExt(properties); + final ShareServiceClientBuilderFactoryProxyExt builderFactory = + new ShareServiceClientBuilderFactoryProxyExt(properties); HttpClientProvider defaultHttpClientProvider = builderFactory.getDefaultHttpClientProvider(); final ShareServiceClientBuilder builder = builderFactory.build(); final ShareServiceClient client = builder.buildClient(); @@ -102,6 +104,15 @@ void testProxyPropertiesConfigured() { verify(defaultHttpClientProvider, times(1)).createInstance(any(HttpClientOptions.class)); } + @Test + void testRetryOptionsConfigured() { + TestAzureStorageFileShareProperties properties = createMinimalServiceProperties(); + final ShareServiceClientBuilderFactoryExt builderFactory = new ShareServiceClientBuilderFactoryExt(properties); + final ShareServiceClientBuilder builder = builderFactory.build(); + final ShareServiceClient client = builder.buildClient(); + verify(builder, times(1)).retryOptions(any(RequestRetryOptions.class)); + } + @Override protected TestAzureStorageFileShareProperties createMinimalServiceProperties() { TestAzureStorageFileShareProperties properties = new TestAzureStorageFileShareProperties(); diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/fileshare/TestAzureStorageFileShareProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/fileshare/TestAzureStorageFileShareProperties.java index 41bec744191a..8bc2b5883172 100644 --- a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/fileshare/TestAzureStorageFileShareProperties.java +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/fileshare/TestAzureStorageFileShareProperties.java @@ -3,46 +3,20 @@ package com.azure.spring.service.storage.fileshare; -import com.azure.spring.service.core.properties.TestAzureProperties; +import com.azure.spring.service.storage.TestAzureStorageProperties; import com.azure.storage.file.share.ShareServiceVersion; /** * Properties for Azure Storage File Share service. */ -public class TestAzureStorageFileShareProperties extends TestAzureProperties implements StorageFileShareProperties { - - public static final String PREFIX = "spring.cloud.azure.storage.fileshare"; - public static final String FILE_ENDPOINT_PATTERN = "https://%s.file%s"; +public class TestAzureStorageFileShareProperties extends TestAzureStorageProperties implements StorageFileShareProperties { private ShareServiceVersion serviceVersion; private String shareName; private String fileName; - private String endpoint; - private String accountKey; - private String sasToken; - private String connectionString; - private String accountName; - - public String getEndpoint() { - return endpoint; - } - - @Override - public String getAccountName() { - return accountName; - } - - @Override - public String getAccountKey() { - return accountKey; - } @Override - public String getConnectionString() { - return connectionString; - } - public ShareServiceVersion getServiceVersion() { return serviceVersion; } @@ -51,6 +25,7 @@ public void setServiceVersion(ShareServiceVersion serviceVersion) { this.serviceVersion = serviceVersion; } + @Override public String getShareName() { return shareName; } @@ -59,6 +34,7 @@ public void setShareName(String shareName) { this.shareName = shareName; } + @Override public String getFileName() { return fileName; } @@ -66,30 +42,4 @@ public String getFileName() { public void setFileName(String fileName) { this.fileName = fileName; } - - @Override - public void setSasToken(String sasToken) { - this.sasToken = sasToken; - } - - @Override - public String getSasToken() { - return sasToken; - } - - public void setEndpoint(String endpoint) { - this.endpoint = endpoint; - } - - public void setAccountKey(String accountKey) { - this.accountKey = accountKey; - } - - public void setConnectionString(String connectionString) { - this.connectionString = connectionString; - } - - public void setAccountName(String accountName) { - this.accountName = accountName; - } } diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/queue/AzureStorageQueueClientBuilderFactoryTest.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/queue/AzureStorageQueueClientBuilderFactoryTest.java index 24a35deaa2cd..e10066c666b0 100644 --- a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/queue/AzureStorageQueueClientBuilderFactoryTest.java +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/queue/AzureStorageQueueClientBuilderFactoryTest.java @@ -15,6 +15,7 @@ import com.azure.spring.service.core.http.TestPerCallHttpPipelinePolicy; import com.azure.spring.service.core.http.TestPerRetryHttpPipelinePolicy; import com.azure.storage.common.StorageSharedKeyCredential; +import com.azure.storage.common.policy.RequestRetryOptions; import com.azure.storage.queue.QueueServiceClient; import com.azure.storage.queue.QueueServiceClientBuilder; import org.junit.jupiter.api.Test; @@ -22,20 +23,23 @@ import org.slf4j.LoggerFactory; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; /** * @author Xiaolu Dai, 2021/8/25. */ class AzureStorageQueueClientBuilderFactoryTest extends AzureServiceClientBuilderFactoryTestBase { + TestAzureStorageQueueHttpProperties, QueueServiceClientBuilderFactory> { private static final Logger LOGGER = LoggerFactory.getLogger(AzureStorageQueueClientBuilderFactoryTest.class); private static final String ENDPOINT = "https://abc.queue.core.windows.net/"; @Test void testStorageSharedKeyCredentialConfigured() { - TestAzureStorageQueueProperties properties = createMinimalServiceProperties(); + TestAzureStorageQueueHttpProperties properties = createMinimalServiceProperties(); properties.setAccountName("test_account_name"); properties.setAccountKey("test_account_key"); final QueueServiceClientBuilder builder = new QueueServiceClientBuilderFactoryExt(properties).build(); @@ -45,7 +49,7 @@ void testStorageSharedKeyCredentialConfigured() { @Test void testAzureSasCredentialConfigured() { - TestAzureStorageQueueProperties properties = createMinimalServiceProperties(); + TestAzureStorageQueueHttpProperties properties = createMinimalServiceProperties(); properties.setSasToken("test"); final QueueServiceClientBuilder builder = new QueueServiceClientBuilderFactoryExt(properties).build(); final QueueServiceClient client = builder.buildClient(); @@ -54,7 +58,7 @@ void testAzureSasCredentialConfigured() { @Test void testHttpClientConfigured() { - TestAzureStorageQueueProperties properties = createMinimalServiceProperties(); + TestAzureStorageQueueHttpProperties properties = createMinimalServiceProperties(); final QueueServiceClientBuilderFactory builderFactory = new QueueServiceClientBuilderFactoryExt(properties); @@ -68,7 +72,7 @@ void testHttpClientConfigured() { @Test void testDefaultHttpPipelinePoliciesConfigured() { - TestAzureStorageQueueProperties properties = createMinimalServiceProperties(); + TestAzureStorageQueueHttpProperties properties = createMinimalServiceProperties(); final QueueServiceClientBuilderFactory builderFactory = new QueueServiceClientBuilderFactoryExt(properties); @@ -85,7 +89,7 @@ void testDefaultHttpPipelinePoliciesConfigured() { @Test void testProxyPropertiesConfigured() { - TestAzureStorageQueueProperties properties = createMinimalServiceProperties(); + TestAzureStorageQueueHttpProperties properties = createMinimalServiceProperties(); ProxyProperties proxyProperties = properties.getProxy(); proxyProperties.setHostname("localhost"); proxyProperties.setPort(8080); @@ -99,16 +103,25 @@ void testProxyPropertiesConfigured() { verify(defaultHttpClientProvider, times(1)).createInstance(any(HttpClientOptions.class)); } + @Test + void testRetryOptionsConfigured() { + TestAzureStorageQueueHttpProperties properties = createMinimalServiceProperties(); + final QueueServiceClientBuilderFactoryExt builderFactory = new QueueServiceClientBuilderFactoryExt(properties); + final QueueServiceClientBuilder builder = builderFactory.build(); + final QueueServiceClient client = builder.buildClient(); + verify(builder, times(1)).retryOptions(any(RequestRetryOptions.class)); + } + @Override - protected TestAzureStorageQueueProperties createMinimalServiceProperties() { - TestAzureStorageQueueProperties properties = new TestAzureStorageQueueProperties(); + protected TestAzureStorageQueueHttpProperties createMinimalServiceProperties() { + TestAzureStorageQueueHttpProperties properties = new TestAzureStorageQueueHttpProperties(); properties.setEndpoint(ENDPOINT); return properties; } static class QueueServiceClientBuilderFactoryExt extends QueueServiceClientBuilderFactory { - QueueServiceClientBuilderFactoryExt(TestAzureStorageQueueProperties blobProperties) { + QueueServiceClientBuilderFactoryExt(TestAzureStorageQueueHttpProperties blobProperties) { super(blobProperties); } @@ -122,7 +135,7 @@ static class QueueServiceClientBuilderFactoryProxyExt extends QueueServiceClient private HttpClientProvider httpClientProvider = mock(DefaultHttpProvider.class); - QueueServiceClientBuilderFactoryProxyExt(TestAzureStorageQueueProperties blobProperties) { + QueueServiceClientBuilderFactoryProxyExt(TestAzureStorageQueueHttpProperties blobProperties) { super(blobProperties); HttpClient httpClient = mock(HttpClient.class); diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/queue/TestAzureStorageQueueHttpProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/queue/TestAzureStorageQueueHttpProperties.java new file mode 100644 index 000000000000..b9f9e4e2257a --- /dev/null +++ b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/queue/TestAzureStorageQueueHttpProperties.java @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.service.storage.queue; + +import com.azure.spring.service.storage.TestAzureStorageProperties; +import com.azure.storage.queue.QueueServiceVersion; + +/** + * Properties for Azure Storage Queue service. + */ +public class TestAzureStorageQueueHttpProperties extends TestAzureStorageProperties implements StorageQueueProperties { + + private QueueServiceVersion serviceVersion; + private String messageEncoding; + + @Override + public QueueServiceVersion getServiceVersion() { + return serviceVersion; + } + + public void setServiceVersion(QueueServiceVersion serviceVersion) { + this.serviceVersion = serviceVersion; + } + + @Override + public String getMessageEncoding() { + return messageEncoding; + } + + public void setMessageEncoding(String messageEncoding) { + this.messageEncoding = messageEncoding; + } +} diff --git a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/queue/TestAzureStorageQueueProperties.java b/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/queue/TestAzureStorageQueueProperties.java deleted file mode 100644 index 9c82e0d01ae4..000000000000 --- a/sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/service/storage/queue/TestAzureStorageQueueProperties.java +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.service.storage.queue; - -import com.azure.spring.service.core.properties.TestAzureProperties; -import com.azure.storage.queue.QueueServiceVersion; - -/** - * Properties for Azure Storage Queue service. - */ -public class TestAzureStorageQueueProperties extends TestAzureProperties implements StorageQueueProperties { - - public static final String PREFIX = "spring.cloud.azure.storage.queue"; - public static final String QUEUE_ENDPOINT_PATTERN = "https://%s.queue%s"; - - private QueueServiceVersion serviceVersion; - private String messageEncoding; - private String endpoint; - private String accountKey; - private String sasToken; - private String connectionString; - private String accountName; - - - public String getEndpoint() { - return endpoint; - } - - @Override - public String getAccountName() { - return accountName; - } - - @Override - public String getAccountKey() { - return accountKey; - } - - @Override - public String getConnectionString() { - return connectionString; - } - - public QueueServiceVersion getServiceVersion() { - return serviceVersion; - } - - public void setServiceVersion(QueueServiceVersion serviceVersion) { - this.serviceVersion = serviceVersion; - } - - public String getMessageEncoding() { - return messageEncoding; - } - - public void setMessageEncoding(String messageEncoding) { - this.messageEncoding = messageEncoding; - } - - @Override - public void setSasToken(String sasToken) { - this.sasToken = sasToken; - } - - @Override - public String getSasToken() { - return this.sasToken; - } - - public void setEndpoint(String endpoint) { - this.endpoint = endpoint; - } - - public void setAccountKey(String accountKey) { - this.accountKey = accountKey; - } - - public void setConnectionString(String connectionString) { - this.connectionString = connectionString; - } - - public void setAccountName(String accountName) { - this.accountName = accountName; - } -} 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 43ffccdfe34c..c678f6b8d8db 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 @@ -3,9 +3,9 @@ package com.azure.spring.eventhubs.core.properties; +import com.azure.spring.core.aware.authentication.ConnectionStringAware; import com.azure.spring.core.connectionstring.implementation.EventHubConnectionString; import com.azure.spring.core.properties.AzureSdkProperties; -import com.azure.spring.core.properties.aware.credential.ConnectionStringAware; import com.azure.spring.service.eventhubs.properties.EventHubCommonDescriptor; /** @@ -75,7 +75,6 @@ public String getConnectionString() { return connectionString; } - @Override public void setConnectionString(String connectionString) { this.connectionString = connectionString; }