diff --git a/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml b/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml index 01ff170891f1b..7d6b19e103111 100755 --- a/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml +++ b/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml @@ -2277,9 +2277,6 @@ - - - + + + + + + + + + + + diff --git a/eng/jacoco-test-coverage/pom.xml b/eng/jacoco-test-coverage/pom.xml index e76556caadd7a..9272d6f0b99a8 100644 --- a/eng/jacoco-test-coverage/pom.xml +++ b/eng/jacoco-test-coverage/pom.xml @@ -409,8 +409,8 @@ com.azure.spring - azure-identity-spring - 1.7.0-beta.1 + azure-spring-boot-core + 1.0.0-beta.1 com.azure.spring diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index 88d4e68fad25c..22dd2d7cac3a1 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -142,7 +142,7 @@ com.azure.spring:azure-spring-cloud-appconfiguration-config;2.0.0-beta.2;2.0.0-b com.azure.spring:azure-spring-cloud-feature-management-web;2.0.0;2.1.0-beta.1 com.azure.spring:azure-spring-cloud-feature-management;2.0.0;2.1.0-beta.1 com.azure.spring:azure-spring-cloud-starter-appconfiguration-config;2.0.0-beta.2;2.0.0-beta.3 -com.azure.spring:azure-identity-spring;1.6.0;1.7.0-beta.1 +com.azure.spring:azure-spring-boot-core;1.0.0-beta.1;1.0.0-beta.1 com.azure.spring:azure-spring-boot-bom;3.6.0;3.7.0-beta.1 com.azure.spring:azure-spring-boot-starter-active-directory-b2c;3.6.0;3.7.0-beta.1 com.azure.spring:azure-spring-boot-starter-active-directory;3.6.0;3.7.0-beta.1 diff --git a/sdk/boms/azure-spring-cloud-dependencies/pom.xml b/sdk/boms/azure-spring-cloud-dependencies/pom.xml index 9ac0c3d550009..e4f07792ea2a8 100644 --- a/sdk/boms/azure-spring-cloud-dependencies/pom.xml +++ b/sdk/boms/azure-spring-cloud-dependencies/pom.xml @@ -52,7 +52,12 @@ 2.6.0 1.3.0 ${project.version} - 1.6.0 + 1.0.0 + 1.3.0 + 1.17.0 + 5.8.0 + 1.8.0 + 3.6.1 12.10.0 @@ -178,8 +183,8 @@ com.azure.spring - azure-identity-spring - ${azure.spring.identity.version} + azure-spring-boot-core + ${azure.spring.core.version} diff --git a/sdk/spring/azure-identity-spring/CHANGELOG.md b/sdk/spring/azure-identity-spring/CHANGELOG.md deleted file mode 100644 index 5cdfcadb35d5b..0000000000000 --- a/sdk/spring/azure-identity-spring/CHANGELOG.md +++ /dev/null @@ -1,32 +0,0 @@ -# Release History - -## 1.7.0-beta.1 (Unreleased) - - -## 1.6.0 (2021-06-23) -### New Features -- Upgrade to [spring-boot-dependencies:2.5.0](https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-dependencies/2.5.0/spring-boot-dependencies-2.5.0.pom). - -## 1.5.0 (2021-05-24) -### New Features -- Upgrade to [spring-boot-dependencies:2.4.5](https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-dependencies/2.4.5/spring-boot-dependencies-2.4.5.pom). -- Upgrade to [spring-cloud-dependencies:2020.0.2](https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-dependencies/2020.0.2/spring-cloud-dependencies-2020.0.2.pom). - - - -## 1.4.0 (2021-04-19) - - -## 1.3.0 (2021-03-22) -### New Features -- Upgrade to `Spring Boot` [2.4.3](https://github.com/spring-projects/spring-boot/releases/tag/v2.4.3). - -## 1.2.0 (2021-03-03) - - -## 1.1.0 (2021-01-20) - - -## 1.0.0 (2020-12-30) -### New Features -- Add Spring identity builder. diff --git a/sdk/spring/azure-spring-boot-core/CHANGELOG.md b/sdk/spring/azure-spring-boot-core/CHANGELOG.md new file mode 100644 index 0000000000000..6ced156fc49df --- /dev/null +++ b/sdk/spring/azure-spring-boot-core/CHANGELOG.md @@ -0,0 +1,3 @@ +# Release History + +## 1.0.0-beta.1 (Unreleased) \ No newline at end of file diff --git a/sdk/spring/azure-identity-spring/README.md b/sdk/spring/azure-spring-boot-core/README.md similarity index 86% rename from sdk/spring/azure-identity-spring/README.md rename to sdk/spring/azure-spring-boot-core/README.md index 3f2cf94d19757..efa43f9ff6743 100644 --- a/sdk/spring/azure-identity-spring/README.md +++ b/sdk/spring/azure-spring-boot-core/README.md @@ -1,6 +1,4 @@ -# Azure Identity Spring Integration client library for Java - -[Source code][src] +# Azure Spring Boot Core client library for Java ## Getting started @@ -23,5 +21,4 @@ To suggest a new feature or changes that could be made, file an issue the same w You can participate community driven [![Gitter](https://badges.gitter.im/Microsoft/spring-on-azure.svg)](https://gitter.im/Microsoft/spring-on-azure) -[src]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-identity-spring/src [environment_checklist]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/spring/ENVIRONMENT_CHECKLIST.md#ready-to-run-checklist diff --git a/sdk/spring/azure-identity-spring/pom.xml b/sdk/spring/azure-spring-boot-core/pom.xml similarity index 75% rename from sdk/spring/azure-identity-spring/pom.xml rename to sdk/spring/azure-spring-boot-core/pom.xml index db6babdd25213..4f3dda5ea637d 100644 --- a/sdk/spring/azure-identity-spring/pom.xml +++ b/sdk/spring/azure-spring-boot-core/pom.xml @@ -11,21 +11,20 @@ com.azure.spring - azure-identity-spring - 1.7.0-beta.1 + azure-spring-boot-core + 1.0.0-beta.1 jar - Azure Identity Spring Integration Library - Azure Identity Spring Integration Library + Azure Spring Boot Core Library + Azure Spring Boot Core Library https://github.com/Azure/azure-sdk-for-java + + 0.10 + 0.10 + + - - org.springframework.boot - spring-boot - 2.5.2 - provided - org.springframework spring-context @@ -40,6 +39,7 @@ com.azure azure-identity 1.3.3 + compile @@ -69,6 +69,18 @@ + + org.apache.maven.plugins + maven-jar-plugin + 3.1.2 + + + + true + + + + diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/ApplicationId.java b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/ApplicationId.java similarity index 72% rename from sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/ApplicationId.java rename to sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/ApplicationId.java index 901cae722bcb6..9f220ab05db03 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/ApplicationId.java +++ b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/ApplicationId.java @@ -1,12 +1,12 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.utils; +package com.azure.spring.core; import java.util.Optional; /** - * Util class for ApplicationId + * Util class for ApplicationId perfix */ public class ApplicationId { // There is 24 char limitation about the app id. So some abbreviation needs to be applied: @@ -15,23 +15,18 @@ public class ApplicationId { // sc: for Spring Cloud // sd: for Spring Data // ss: for Spring Streams + // si: for Spring Integration // kv: for Key Vault // sb: for Storage Blobs // sf: for Storage Files + // sq: for Storage Queue // eh: for Event Hub // bus: for Service Bus // cfg: for App Config // cos: for Cosmos // aad: for AAD // b2c: for AAD B2C - public static final String VERSION = Optional.of(ApplicationId.class) - .map(Class::getPackage) - .map(Package::getImplementationVersion) - .orElse("unknown"); - public static final String AZURE_SPRING_KEY_VAULT = "az-sp-kv/" + VERSION; - public static final String AZURE_SPRING_SERVICE_BUS = "az-sp-bus/" + VERSION; - public static final String AZURE_SPRING_STORAGE_BLOB = "az-sp-sb/" + VERSION; - public static final String AZURE_SPRING_STORAGE_FILES = "az-sp-sf/" + VERSION; + /** * AZURE_SPRING_AAD does not contain VERSION, because AAD server support 2 headers: * 1. x-client-SKU; @@ -39,5 +34,16 @@ public class ApplicationId { */ public static final String AZURE_SPRING_AAD = "az-sp-aad"; public static final String AZURE_SPRING_B2C = "az-sp-b2c"; + public static final String AZURE_SPRING_EVENT_HUB = "az-sc-eh/;"; + public static final String AZURE_SPRING_KEY_VAULT = "az-sp-kv/"; + public static final String AZURE_SPRING_SERVICE_BUS = "az-sp-bus/"; + public static final String AZURE_SPRING_STORAGE_BLOB = "az-sp-sb/"; + public static final String AZURE_SPRING_STORAGE_FILES = "az-sp-sf/"; + public static final String AZURE_SPRING_STORAGE_QUEUE = "az-si-sq/"; + //TODO: version should contains each starter library's version + public static final String VERSION = Optional.of(ApplicationId.class) + .map(Class::getPackage) + .map(Package::getImplementationVersion) + .orElse("unknown"); } diff --git a/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/env/AzureEnvironment.java b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/env/AzureEnvironment.java new file mode 100644 index 0000000000000..0de48811e1096 --- /dev/null +++ b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/env/AzureEnvironment.java @@ -0,0 +1,398 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +package com.azure.spring.core.env; + +import com.azure.identity.AzureAuthorityHosts; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * An instance of this class describes an environment in Azure. + */ +public final class AzureEnvironment { + + public static final String KEY_VAULT_DNS_SUFFIX = "keyVaultDnsSuffix"; + public static final String STORAGE_ENDPOINT_SUFFIX = "storageEndpointSuffix"; + public static final String AZURE_DATA_LAKE_STORE_FILE_SYSTEM_ENDPOINT_SUFFIX = "azureDataLakeStoreFileSystemEndpointSuffix"; + public static final String AZURE_DATA_LAKE_ANALYTICS_CATALOG_AND_JOB_ENDPOINT_SUFFIX = "azureDataLakeAnalyticsCatalogAndJobEndpointSuffix"; + public static final String PUBLISHING_PROFILE_URL = "publishingProfileUrl"; + public static final String MANAGEMENT_ENDPOINT_URL = "managementEndpointUrl"; + public static final String RESOURCE_MANAGER_ENDPOINT_URL = "resourceManagerEndpointUrl"; + public static final String SQL_MANAGEMENT_ENDPOINT_URL = "sqlManagementEndpointUrl"; + public static final String SQL_SERVER_HOSTNAME_SUFFIX = "sqlServerHostnameSuffix"; + public static final String GALLERY_ENDPOINT_URL = "galleryEndpointUrl"; + public static final String ACTIVE_DIRECTORY_ENDPOINT_URL = "activeDirectoryEndpointUrl"; + public static final String ACTIVE_DIRECTORY_RESOURCE_ID = "activeDirectoryResourceId"; + public static final String ACTIVE_DIRECTORY_GRAPH_RESOURCE_ID = "activeDirectoryGraphResourceId"; + public static final String MICROSOFT_GRAPH_RESOURCE_ID = "microsoftGraphResourceId"; + public static final String DATA_LAKE_ENDPOINT_RESOURCE_ID = "dataLakeEndpointResourceId"; + public static final String ACTIVE_DIRECTORY_GRAPH_API_VERSION = "activeDirectoryGraphApiVersion"; + public static final String AZURE_LOG_ANALYTICS_RESOURCE_ID = "azureLogAnalyticsResourceId"; + public static final String AZURE_APPLICATION_INSIGHTS_RESOURCE_ID = "azureApplicationInsightsResourceId"; + public static final String PORTAL_URL = "portalUrl"; + + /** + * the map of all endpoints. + */ + private final Map endpoints; + + /** + * Initializes an instance of AzureEnvironment class. + * + * @param endpoints a map storing all the endpoint info + */ + public AzureEnvironment(Map endpoints) { + this.endpoints = endpoints; + } + + /** + * Provides the settings for authentication with Azure. + */ + public static final AzureEnvironment AZURE = new AzureEnvironment(new HashMap() { + { + put(PORTAL_URL, "http://go.microsoft.com/fwlink/?LinkId=254433"); + put(PUBLISHING_PROFILE_URL, "http://go.microsoft.com/fwlink/?LinkId=254432"); + put(MANAGEMENT_ENDPOINT_URL, "https://management.core.windows.net/"); + put(RESOURCE_MANAGER_ENDPOINT_URL, "https://management.azure.com/"); + put(SQL_MANAGEMENT_ENDPOINT_URL, "https://management.core.windows.net:8443/"); + put(SQL_SERVER_HOSTNAME_SUFFIX, ".database.windows.net"); + put(GALLERY_ENDPOINT_URL, "https://gallery.azure.com/"); + put(ACTIVE_DIRECTORY_ENDPOINT_URL, "https://login.microsoftonline.com/"); + put(ACTIVE_DIRECTORY_RESOURCE_ID, "https://management.core.windows.net/"); + put(ACTIVE_DIRECTORY_GRAPH_RESOURCE_ID, "https://graph.windows.net/"); + put(MICROSOFT_GRAPH_RESOURCE_ID, "https://graph.microsoft.com/"); + put(DATA_LAKE_ENDPOINT_RESOURCE_ID, "https://datalake.azure.net/"); + put(ACTIVE_DIRECTORY_GRAPH_API_VERSION, "2013-04-05"); + put(STORAGE_ENDPOINT_SUFFIX, ".core.windows.net"); + put(KEY_VAULT_DNS_SUFFIX, ".vault.azure.net"); + put(AZURE_DATA_LAKE_STORE_FILE_SYSTEM_ENDPOINT_SUFFIX, "azuredatalakestore.net"); + put(AZURE_DATA_LAKE_ANALYTICS_CATALOG_AND_JOB_ENDPOINT_SUFFIX, "azuredatalakeanalytics.net"); + put(AZURE_LOG_ANALYTICS_RESOURCE_ID, "https://api.loganalytics.io/"); + put(AZURE_APPLICATION_INSIGHTS_RESOURCE_ID, "https://api.applicationinsights.io/"); + } + }); + + /** + * Provides the settings for authentication with Azure China. + */ + public static final AzureEnvironment AZURE_CHINA = new AzureEnvironment(new HashMap() { + { + put(PORTAL_URL, "http://go.microsoft.com/fwlink/?LinkId=301902"); + put(PUBLISHING_PROFILE_URL, "http://go.microsoft.com/fwlink/?LinkID=301774"); + put(MANAGEMENT_ENDPOINT_URL, "https://management.core.chinacloudapi.cn/"); + put(RESOURCE_MANAGER_ENDPOINT_URL, "https://management.chinacloudapi.cn/"); + put(SQL_MANAGEMENT_ENDPOINT_URL, "https://management.core.chinacloudapi.cn:8443/"); + put(SQL_SERVER_HOSTNAME_SUFFIX, ".database.chinacloudapi.cn"); + put(GALLERY_ENDPOINT_URL, "https://gallery.chinacloudapi.cn/"); + put(ACTIVE_DIRECTORY_ENDPOINT_URL, "https://login.chinacloudapi.cn/"); + put(ACTIVE_DIRECTORY_RESOURCE_ID, "https://management.core.chinacloudapi.cn/"); + put(ACTIVE_DIRECTORY_GRAPH_RESOURCE_ID, "https://graph.chinacloudapi.cn/"); + put(MICROSOFT_GRAPH_RESOURCE_ID, "https://microsoftgraph.chinacloudapi.cn/"); + // TODO: add resource id for the china cloud for datalake once it is defined. + put(DATA_LAKE_ENDPOINT_RESOURCE_ID, "N/A"); + put(ACTIVE_DIRECTORY_GRAPH_API_VERSION, "2013-04-05"); + put(STORAGE_ENDPOINT_SUFFIX, ".core.chinacloudapi.cn"); + put(KEY_VAULT_DNS_SUFFIX, ".vault.azure.cn"); + // TODO: add dns suffixes for the china cloud for datalake store and datalake analytics once they are + // defined. + put(AZURE_DATA_LAKE_STORE_FILE_SYSTEM_ENDPOINT_SUFFIX, "N/A"); + put(AZURE_DATA_LAKE_ANALYTICS_CATALOG_AND_JOB_ENDPOINT_SUFFIX, "N/A"); + put(AZURE_LOG_ANALYTICS_RESOURCE_ID, "N/A"); + put(AZURE_APPLICATION_INSIGHTS_RESOURCE_ID, "N/A"); + + } + }); + + /** + * Provides the settings for authentication with Azure US Government. + */ + public static final AzureEnvironment AZURE_US_GOVERNMENT = new AzureEnvironment(new HashMap() { + { + put(PORTAL_URL, "https://manage.windowsazure.us"); + put(PUBLISHING_PROFILE_URL, "https://manage.windowsazure.us/publishsettings/index"); + put(MANAGEMENT_ENDPOINT_URL, "https://management.core.usgovcloudapi.net/"); + put(RESOURCE_MANAGER_ENDPOINT_URL, "https://management.usgovcloudapi.net/"); + put(SQL_MANAGEMENT_ENDPOINT_URL, "https://management.core.usgovcloudapi.net:8443/"); + put(SQL_SERVER_HOSTNAME_SUFFIX, ".database.usgovcloudapi.net"); + put(GALLERY_ENDPOINT_URL, "https://gallery.usgovcloudapi.net/"); + put(ACTIVE_DIRECTORY_ENDPOINT_URL, "https://login.microsoftonline.us/"); + put(ACTIVE_DIRECTORY_RESOURCE_ID, "https://management.core.usgovcloudapi.net/"); + put(ACTIVE_DIRECTORY_GRAPH_RESOURCE_ID, "https://graph.windows.net/"); + put(MICROSOFT_GRAPH_RESOURCE_ID, "https://graph.microsoft.us/"); + // TODO: add resource id for the US government for datalake once it is defined. + put(DATA_LAKE_ENDPOINT_RESOURCE_ID, "N/A"); + put(ACTIVE_DIRECTORY_GRAPH_API_VERSION, "2013-04-05"); + put(STORAGE_ENDPOINT_SUFFIX, ".core.usgovcloudapi.net"); + put(KEY_VAULT_DNS_SUFFIX, ".vault.usgovcloudapi.net"); + // TODO: add dns suffixes for the US government for datalake store and datalake analytics once they are + // defined. + put(AZURE_DATA_LAKE_STORE_FILE_SYSTEM_ENDPOINT_SUFFIX, "N/A"); + put(AZURE_DATA_LAKE_ANALYTICS_CATALOG_AND_JOB_ENDPOINT_SUFFIX, "N/A"); + put(AZURE_LOG_ANALYTICS_RESOURCE_ID, "https://api.loganalytics.us/"); + put(AZURE_APPLICATION_INSIGHTS_RESOURCE_ID, "N/A"); + + } + }); + + /** + * Provides the settings for authentication with Azure Germany. + */ + public static final AzureEnvironment AZURE_GERMANY = new AzureEnvironment(new HashMap() { + { + put(PORTAL_URL, "http://portal.microsoftazure.de/"); + put(PUBLISHING_PROFILE_URL, "https://manage.microsoftazure.de/publishsettings/index"); + put(MANAGEMENT_ENDPOINT_URL, "https://management.core.cloudapi.de/"); + put(RESOURCE_MANAGER_ENDPOINT_URL, "https://management.microsoftazure.de/"); + put(SQL_MANAGEMENT_ENDPOINT_URL, "https://management.core.cloudapi.de:8443/"); + put(SQL_SERVER_HOSTNAME_SUFFIX, ".database.cloudapi.de"); + put(GALLERY_ENDPOINT_URL, "https://gallery.cloudapi.de/"); + put(ACTIVE_DIRECTORY_ENDPOINT_URL, "https://login.microsoftonline.de/"); + put(ACTIVE_DIRECTORY_RESOURCE_ID, "https://management.core.cloudapi.de/"); + put(ACTIVE_DIRECTORY_GRAPH_RESOURCE_ID, "https://graph.cloudapi.de/"); + put(MICROSOFT_GRAPH_RESOURCE_ID, "https://graph.microsoft.de/"); + // TODO: add resource id for the germany cloud for datalake once it is defined. + put(DATA_LAKE_ENDPOINT_RESOURCE_ID, "N/A"); + put(ACTIVE_DIRECTORY_GRAPH_API_VERSION, "2013-04-05"); + put(STORAGE_ENDPOINT_SUFFIX, ".core.cloudapi.de"); + put(KEY_VAULT_DNS_SUFFIX, ".vault.microsoftazure.de"); + // TODO: add dns suffixes for the germany cloud for datalake store and datalake analytics once they are + // defined. + put(AZURE_DATA_LAKE_STORE_FILE_SYSTEM_ENDPOINT_SUFFIX, "N/A"); + put(AZURE_DATA_LAKE_ANALYTICS_CATALOG_AND_JOB_ENDPOINT_SUFFIX, "N/A"); + put(AZURE_LOG_ANALYTICS_RESOURCE_ID, "N/A"); + put(AZURE_APPLICATION_INSIGHTS_RESOURCE_ID, "N/A"); + + } + }); + + /** + * @return the entirety of the endpoints associated with the current environment. + */ + public Map getEndpoints() { + return endpoints; + } + + /** + * @return the list of known environments to Azure SDK. + */ + public static List knownEnvironments() { + return Arrays.asList(AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT); + } + + /** + * @return the management portal URL. + */ + public String getPortal() { + return endpoints.get(PORTAL_URL); + } + + /** + * @return the publish settings file URL. + */ + public String getPublishingProfile() { + return endpoints.get(PUBLISHING_PROFILE_URL); + } + + /** + * @return the management service endpoint. + */ + public String getManagementEndpoint() { + return endpoints.get(MANAGEMENT_ENDPOINT_URL); + } + + /** + * @return the resource management endpoint. + */ + public String getResourceManagerEndpoint() { + return endpoints.get(RESOURCE_MANAGER_ENDPOINT_URL); + } + + /** + * @return the sql server management endpoint for mobile commands. + */ + public String getSqlManagementEndpoint() { + return endpoints.get(SQL_MANAGEMENT_ENDPOINT_URL); + } + + /** + * @return The resource ID to obtain AD tokens for. + */ + public String getActiveDirectoryResourceId() { + return endpoints.get(ACTIVE_DIRECTORY_RESOURCE_ID); + } + + /** + * @return the template gallery endpoint. + */ + public String getGalleryEndpoint() { + return endpoints.get(GALLERY_ENDPOINT_URL); + } + + /** + * @return the Active Directory resource ID. + */ + public String getGraphEndpoint() { + return endpoints.get(ACTIVE_DIRECTORY_GRAPH_RESOURCE_ID); + } + + /** + * @return the Microsoft Graph resource ID. + */ + public String getMicrosoftGraphEndpoint() { + return endpoints.get(MICROSOFT_GRAPH_RESOURCE_ID); + } + + /** + * @return the Data Lake resource ID. + */ + public String getDataLakeEndpointResourceId() { + return endpoints.get(DATA_LAKE_ENDPOINT_RESOURCE_ID); + } + + /** + * @return the Active Directory api version. + */ + public String getActiveDirectoryGraphApiVersion() { + return endpoints.get(ACTIVE_DIRECTORY_GRAPH_API_VERSION); + } + + /** + * @return the endpoint suffix for storage accounts. + */ + public String getStorageEndpointSuffix() { + return endpoints.get(STORAGE_ENDPOINT_SUFFIX); + } + + /** + * @return the keyvault service dns suffix. + */ + public String getKeyVaultDnsSuffix() { + return endpoints.get(KEY_VAULT_DNS_SUFFIX); + } + + /** + * @return the data lake store filesystem service dns suffix. + */ + public String getAzureDataLakeStoreFileSystemEndpointSuffix() { + return endpoints.get(AZURE_DATA_LAKE_STORE_FILE_SYSTEM_ENDPOINT_SUFFIX); + } + + /** + * @return the data lake analytics job and catalog service dns suffix. + */ + public String getAzureDataLakeAnalyticsCatalogAndJobEndpointSuffix() { + return endpoints.get(AZURE_DATA_LAKE_ANALYTICS_CATALOG_AND_JOB_ENDPOINT_SUFFIX); + } + + /** + * @return the log analytics endpoint. + */ + public String getLogAnalyticsEndpoint() { + return endpoints.get(AZURE_LOG_ANALYTICS_RESOURCE_ID); + } + + /** + * @return the log analytics endpoint. + */ + public String getApplicationInsightsEndpoint() { + return endpoints.get(AZURE_APPLICATION_INSIGHTS_RESOURCE_ID); + } + + public static String toAuthorityHost(String azureEnvironment) { + switch (azureEnvironment) { + case "AzureChina": + return AzureAuthorityHosts.AZURE_CHINA; + case "AzureGermany": + return AzureAuthorityHosts.AZURE_GERMANY; + case "AzureUSGovernment": + return AzureAuthorityHosts.AZURE_GOVERNMENT; + default: + return AzureAuthorityHosts.AZURE_PUBLIC_CLOUD; + } + } + + /** + * The enum representing available endpoints in an environment. + */ + public enum Endpoint { + /** + * Azure management endpoint. + */ + MANAGEMENT(MANAGEMENT_ENDPOINT_URL), + /** + * Azure Resource Manager endpoint. + */ + RESOURCE_MANAGER(RESOURCE_MANAGER_ENDPOINT_URL), + /** + * Azure SQL endpoint. + */ + SQL(SQL_MANAGEMENT_ENDPOINT_URL), + /** + * Azure Gallery endpoint. + */ + GALLERY(GALLERY_ENDPOINT_URL), + /** + * Active Directory authentication endpoint. + */ + ACTIVE_DIRECTORY(ACTIVE_DIRECTORY_ENDPOINT_URL), + /** + * Azure Active Directory Graph APIs endpoint. + */ + GRAPH(ACTIVE_DIRECTORY_GRAPH_RESOURCE_ID), + /** + * Key Vault DNS suffix. + */ + KEYVAULT(KEY_VAULT_DNS_SUFFIX), + /** + * Azure Data Lake Store DNS suffix. + */ + DATA_LAKE_STORE(AZURE_DATA_LAKE_STORE_FILE_SYSTEM_ENDPOINT_SUFFIX), + /** + * Azure Data Lake Analytics DNS suffix. + */ + DATA_LAKE_ANALYTICS(AZURE_DATA_LAKE_ANALYTICS_CATALOG_AND_JOB_ENDPOINT_SUFFIX), + /** + * Azure Log Analytics endpoint. + */ + LOG_ANALYTICS(AZURE_LOG_ANALYTICS_RESOURCE_ID), + /** + * Azure Application Insights. + */ + APPLICATION_INSIGHTS(AZURE_APPLICATION_INSIGHTS_RESOURCE_ID), + /** + * Microsoft Graph APIs endpoint. + */ + MICROSOFT_GRAPH(MICROSOFT_GRAPH_RESOURCE_ID); + + private final String field; + + Endpoint(String value) { + this.field = value; + } + + /** + * @return a unique identifier for the endpoint in the environment + */ + public String identifier() { + return field; + } + + @Override + public String toString() { + return field; + } + } + + /** + * Gets the endpoint URL for the current environment. + * + * @param endpoint the endpoint. + * @return the URL for the endpoint, null if no match. + */ + public String getUrlByEndpoint(Endpoint endpoint) { + return endpoints.get(endpoint.identifier()); + } +} diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/package-info.java b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/env/package-info.java similarity index 50% rename from sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/package-info.java rename to sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/env/package-info.java index c2b23b4ad5538..604c4afcb8b1d 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/package-info.java +++ b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/env/package-info.java @@ -2,6 +2,6 @@ // Licensed under the MIT License. /** - * Package com.azure.spring.cloud.context.core.util; + * Package com.azure.spring.core.env; */ -package com.azure.spring.cloud.context.core.util; +package com.azure.spring.core.env; diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/package-info.java b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/package-info.java similarity index 61% rename from sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/package-info.java rename to sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/package-info.java index eaa2719ffd21d..be239a2b1e729 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/package-info.java +++ b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/package-info.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. + /** - * Package com.azure.spring.utils + * Package com.azure.spring.core; */ -package com.azure.spring.utils; +package com.azure.spring.core; diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/Memoizer.java b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/util/Memoizer.java similarity index 95% rename from sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/Memoizer.java rename to sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/util/Memoizer.java index 9fcdc9ef9009f..c47e8518d7450 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/Memoizer.java +++ b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/util/Memoizer.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.context.core.util; +package com.azure.spring.core.util; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/Tuple.java b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/util/Tuple.java similarity index 95% rename from sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/Tuple.java rename to sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/util/Tuple.java index b64d6a01343a2..157dbd8cd4529 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/Tuple.java +++ b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/util/Tuple.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.context.core.util; +package com.azure.spring.core.util; import java.util.Objects; diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/TypeMap.java b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/util/TypeMap.java similarity index 91% rename from sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/TypeMap.java rename to sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/util/TypeMap.java index a887206013491..dd280d9dca061 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/TypeMap.java +++ b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/util/TypeMap.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.context.core.util; +package com.azure.spring.core.util; import java.util.HashMap; import java.util.Map; diff --git a/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/util/package-info.java b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/util/package-info.java new file mode 100644 index 0000000000000..2174fe25415f6 --- /dev/null +++ b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/core/util/package-info.java @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/** + * Package com.azure.spring.core.util; + */ +package com.azure.spring.core.util; diff --git a/sdk/spring/azure-identity-spring/src/main/java/com/azure/spring/identity/DefaultSpringCredentialBuilder.java b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/identity/DefaultSpringCredentialBuilder.java similarity index 100% rename from sdk/spring/azure-identity-spring/src/main/java/com/azure/spring/identity/DefaultSpringCredentialBuilder.java rename to sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/identity/DefaultSpringCredentialBuilder.java diff --git a/sdk/spring/azure-identity-spring/src/main/java/com/azure/spring/identity/PrefixedSpringCredentialBuilder.java b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/identity/PrefixedSpringCredentialBuilder.java similarity index 100% rename from sdk/spring/azure-identity-spring/src/main/java/com/azure/spring/identity/PrefixedSpringCredentialBuilder.java rename to sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/identity/PrefixedSpringCredentialBuilder.java diff --git a/sdk/spring/azure-identity-spring/src/main/java/com/azure/spring/identity/SpringCredentialBuilderBase.java b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/identity/SpringCredentialBuilderBase.java similarity index 61% rename from sdk/spring/azure-identity-spring/src/main/java/com/azure/spring/identity/SpringCredentialBuilderBase.java rename to sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/identity/SpringCredentialBuilderBase.java index 8aba8c4093e38..275bbd7955cde 100644 --- a/sdk/spring/azure-identity-spring/src/main/java/com/azure/spring/identity/SpringCredentialBuilderBase.java +++ b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/identity/SpringCredentialBuilderBase.java @@ -3,13 +3,17 @@ package com.azure.spring.identity; import com.azure.core.credential.TokenCredential; +import com.azure.identity.AzureAuthorityHosts; import com.azure.identity.ClientCertificateCredentialBuilder; import com.azure.identity.ClientSecretCredentialBuilder; import com.azure.identity.ManagedIdentityCredential; import com.azure.identity.ManagedIdentityCredentialBuilder; -import org.springframework.boot.context.properties.bind.Binder; import org.springframework.core.env.Environment; +import java.util.Optional; + +import static com.azure.spring.core.env.AzureEnvironment.toAuthorityHost; + /** * */ @@ -36,25 +40,28 @@ protected TokenCredential populateTokenCredentialBasedOnClientId(String prefix) } private TokenCredential populateTokenCredential(String prefix, boolean createDefault) { - String tenantId = getPropertyValue(prefix, "tenant-id"); - String clientId = getPropertyValue(prefix, "client-id"); - String clientSecret = getPropertyValue(prefix, "client-secret"); + String tenantId = getPropertyValue(prefix + "tenant-id"); + String clientId = getPropertyValue(prefix + "client-id"); + String clientSecret = getPropertyValue(prefix + "client-secret"); + String authorityHost = getAuthorityHost(prefix); if (tenantId != null && clientId != null && clientSecret != null) { return new ClientSecretCredentialBuilder() .tenantId(tenantId) .clientId(clientId) .clientSecret(clientSecret) + .authorityHost(authorityHost) .build(); } - String certPath = getPropertyValue(prefix, "client-certificate-path"); + String certPath = getPropertyValue(prefix + "client-certificate-path"); if (tenantId != null && clientId != null && certPath != null) { return new ClientCertificateCredentialBuilder() .tenantId(tenantId) .clientId(clientId) .pemCertificate(certPath) + .authorityHost(authorityHost) .build(); } @@ -69,10 +76,20 @@ protected ManagedIdentityCredential defaultManagedIdentityCredential() { return new ManagedIdentityCredentialBuilder().build(); } - protected String getPropertyValue(String prefix, String propertyKey) { - return Binder.get(this.environment) - .bind(prefix + propertyKey, String.class) - .orElse(null); + protected String getPropertyValue(String propertyName) { + return environment.getProperty(propertyName); + } + + protected String getPropertyValue(String propertyName, String defaultValue) { + return environment.getProperty(propertyName, defaultValue); + } + + protected String getAuthorityHost(String prefix) { + return Optional.ofNullable(getPropertyValue(prefix + "authority-host")) + .orElse(Optional.ofNullable(getPropertyValue(prefix + "environment")) + .filter(env -> !env.isEmpty()) + .map(env -> toAuthorityHost(env)) + .orElse(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)); } } diff --git a/sdk/spring/azure-identity-spring/src/main/java/com/azure/spring/identity/package-info.java b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/identity/package-info.java similarity index 78% rename from sdk/spring/azure-identity-spring/src/main/java/com/azure/spring/identity/package-info.java rename to sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/identity/package-info.java index 391ffff04977d..4de576fa1a58e 100644 --- a/sdk/spring/azure-identity-spring/src/main/java/com/azure/spring/identity/package-info.java +++ b/sdk/spring/azure-spring-boot-core/src/main/java/com/azure/spring/identity/package-info.java @@ -2,6 +2,6 @@ // Licensed under the MIT License. /** - * Package com.azure.identity.spring; + * Package com.azure.spring.identity; */ package com.azure.spring.identity; diff --git a/sdk/spring/azure-identity-spring/src/test/java/com/azure/spring/identity/DefaultSpringCredentialBuilderTest.java b/sdk/spring/azure-spring-boot-core/src/test/java/com/azure/spring/identity/DefaultSpringCredentialBuilderTest.java similarity index 100% rename from sdk/spring/azure-identity-spring/src/test/java/com/azure/spring/identity/DefaultSpringCredentialBuilderTest.java rename to sdk/spring/azure-spring-boot-core/src/test/java/com/azure/spring/identity/DefaultSpringCredentialBuilderTest.java diff --git a/sdk/spring/azure-identity-spring/src/test/java/com/azure/spring/identity/PrefixedSpringCredentialBuilderTest.java b/sdk/spring/azure-spring-boot-core/src/test/java/com/azure/spring/identity/PrefixedSpringCredentialBuilderTest.java similarity index 100% rename from sdk/spring/azure-identity-spring/src/test/java/com/azure/spring/identity/PrefixedSpringCredentialBuilderTest.java rename to sdk/spring/azure-spring-boot-core/src/test/java/com/azure/spring/identity/PrefixedSpringCredentialBuilderTest.java diff --git a/sdk/spring/azure-identity-spring/src/test/java/com/azure/spring/identity/SpringCredentialBuilderBaseTest.java b/sdk/spring/azure-spring-boot-core/src/test/java/com/azure/spring/identity/SpringCredentialBuilderBaseTest.java similarity index 65% rename from sdk/spring/azure-identity-spring/src/test/java/com/azure/spring/identity/SpringCredentialBuilderBaseTest.java rename to sdk/spring/azure-spring-boot-core/src/test/java/com/azure/spring/identity/SpringCredentialBuilderBaseTest.java index ab466e261ca0d..b1a3d13903f63 100644 --- a/sdk/spring/azure-identity-spring/src/test/java/com/azure/spring/identity/SpringCredentialBuilderBaseTest.java +++ b/sdk/spring/azure-spring-boot-core/src/test/java/com/azure/spring/identity/SpringCredentialBuilderBaseTest.java @@ -3,6 +3,7 @@ package com.azure.spring.identity; import com.azure.core.credential.TokenCredential; +import com.azure.identity.AzureAuthorityHosts; import com.azure.identity.ClientCertificateCredential; import com.azure.identity.ClientSecretCredential; import com.azure.identity.ManagedIdentityCredential; @@ -23,19 +24,54 @@ public void testPropertyBinder() { final Properties properties = new PropertiesBuilder() .prefix(prefix) - .property("clientId", "fake-client-id") // camel case + //TODO: make getPropertyValue compatible with relax binding .property("client-secret", "fake-secret") // kebab case - .property("tenant_id", "fake-tenant-id") // underscore notation - .property("CLIENT_CERTIFICATE_PATH", "fake-cert-path")// upper case format +// .property("clientId", "fake-client-id") // camel case +// .property("tenant_id", "fake-tenant-id") // underscore notation +// .property("CLIENT_CERTIFICATE_PATH", "fake-cert-path")// upper case format .build(); final TestSpringCredentialBuilder builder = new TestSpringCredentialBuilder() .environment(buildEnvironment(properties)); - assertEquals("fake-client-id", builder.getPropertyValue(prefix, "client-id")); - assertEquals("fake-secret", builder.getPropertyValue(prefix, "client-secret")); - assertEquals("fake-tenant-id", builder.getPropertyValue(prefix, "tenant-id")); - assertEquals("fake-cert-path", builder.getPropertyValue(prefix, "client-certificate-path")); + assertEquals("fake-secret", builder.getPropertyValue(prefix + "client-secret")); +// assertEquals("fake-client-id", builder.getPropertyValue(prefix + "client-id")); +// assertEquals("fake-tenant-id", builder.getPropertyValue(prefix + "tenant-id")); +// assertEquals("fake-cert-path", builder.getPropertyValue(prefix + "client-certificate-path")); + assertEquals(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD, builder.getAuthorityHost(prefix)); + } + + @Test + public void testGetAuthorityHost() { + + final String prefix = "azure.activedirectory."; + + final Properties properties = new PropertiesBuilder() + .prefix(prefix) + .property("authority-host", "fake-authority-host") + .property("environment", "AzureChina") + .build(); + + final TestSpringCredentialBuilder builder = new TestSpringCredentialBuilder() + .environment(buildEnvironment(properties)); + + assertEquals("fake-authority-host", builder.getAuthorityHost(prefix)); + } + + @Test + public void testGetAuthorityHostFromEnvironment() { + + final String prefix = "azure.activedirectory."; + + final Properties properties = new PropertiesBuilder() + .prefix(prefix) + .property("environment", "AzureChina") + .build(); + + final TestSpringCredentialBuilder builder = new TestSpringCredentialBuilder() + .environment(buildEnvironment(properties)); + + assertEquals(AzureAuthorityHosts.AZURE_CHINA, builder.getAuthorityHost(prefix)); } @Test diff --git a/sdk/spring/azure-identity-spring/src/test/java/com/azure/spring/identity/SpringCredentialTestBase.java b/sdk/spring/azure-spring-boot-core/src/test/java/com/azure/spring/identity/SpringCredentialTestBase.java similarity index 100% rename from sdk/spring/azure-identity-spring/src/test/java/com/azure/spring/identity/SpringCredentialTestBase.java rename to sdk/spring/azure-spring-boot-core/src/test/java/com/azure/spring/identity/SpringCredentialTestBase.java diff --git a/sdk/spring/azure-spring-boot-starter-keyvault-secrets/CHANGELOG.md b/sdk/spring/azure-spring-boot-starter-keyvault-secrets/CHANGELOG.md index d26e990046df1..8d0b36a8217a2 100644 --- a/sdk/spring/azure-spring-boot-starter-keyvault-secrets/CHANGELOG.md +++ b/sdk/spring/azure-spring-boot-starter-keyvault-secrets/CHANGELOG.md @@ -2,7 +2,6 @@ ## 3.7.0-beta.1 (Unreleased) - ## 3.6.0 (2021-06-23) ### Breaking Changes diff --git a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/spring/utils/test/ApplicationIdTest.java b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/spring/utils/test/ApplicationIdTest.java index b6b13d5078b29..45fdce1781549 100644 --- a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/spring/utils/test/ApplicationIdTest.java +++ b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/spring/utils/test/ApplicationIdTest.java @@ -3,7 +3,7 @@ package com.azure.spring.utils.test; -import com.azure.spring.utils.ApplicationId; +import com.azure.spring.core.ApplicationId; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -16,7 +16,7 @@ public class ApplicationIdTest { so there are some requirements to run this test: 1. This test can not put in azure-spring-boot module. If put in azure-spring-boot module, azure-spring-boot-xxx.jar/META-INF/MANIFEST.MF can not be used. - 2. This test can not put in the same package with ApplicationId: "com.azure.spring.utils". + 2. This test can not put in the same package with ApplicationId: "com.azure.spring.core". If put in that package, then ApplicationId.class.getPackage().getImplementationVersion() will return null. 3. This test can not run in Intellij with default configuration. In Intellij, the default dependency type is "module", not "external library". diff --git a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/AADSeleniumITHelper.java b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/AADSeleniumITHelper.java index 0378095a86700..db58017adcda2 100644 --- a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/AADSeleniumITHelper.java +++ b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/AADSeleniumITHelper.java @@ -1,6 +1,5 @@ package com.azure.test.aad.selenium; -import com.azure.spring.utils.AzureCloudUrls; import com.azure.test.aad.common.SeleniumITHelper; import org.openqa.selenium.By; import org.openqa.selenium.Keys; @@ -33,8 +32,8 @@ public static Map createDefaultProperties() { defaultProperties.put("azure.activedirectory.client-secret", AAD_SINGLE_TENANT_CLIENT_SECRET); defaultProperties.put("azure.activedirectory.user-group.allowed-groups", "group1"); defaultProperties.put("azure.activedirectory.post-logout-redirect-uri", "http://localhost:${server.port}"); - defaultProperties.put("azure.activedirectory.base-uri", AzureCloudUrls.getBaseUrl(AZURE_CLOUD_TYPE)); - defaultProperties.put("azure.activedirectory.graph-base-uri", AzureCloudUrls.getGraphBaseUrl(AZURE_CLOUD_TYPE)); + defaultProperties.put("azure.activedirectory.base-uri", getBaseUrl(AZURE_CLOUD_TYPE)); + defaultProperties.put("azure.activedirectory.graph-base-uri", getGraphBaseUrl(AZURE_CLOUD_TYPE)); return defaultProperties; } @@ -97,7 +96,7 @@ public String logoutAndGetLogoutUsername() { public String httpGetWithIncrementalConsent(String endpoint) { driver.get((app.root() + endpoint)); - String oauth2AuthorizationUrlFraction = String.format(AzureCloudUrls.getBaseUrl(AZURE_CLOUD_TYPE) + String oauth2AuthorizationUrlFraction = String.format(getBaseUrl(AZURE_CLOUD_TYPE) + "%s/oauth2/v2.0/" + "authorize?", AAD_TENANT_ID_1); wait.until(ExpectedConditions.urlContains(oauth2AuthorizationUrlFraction)); @@ -109,4 +108,19 @@ public String httpGetWithIncrementalConsent(String endpoint) { public String getUsername() { return username; } + + public static String getBaseUrl(String cloudType) { + return cloudType.equals("Global") ? "https://login.microsoftonline.com/" + : "https://login.partner.microsoftonline.cn/"; + } + + public static String getGraphBaseUrl(String cloudType) { + return cloudType.equals("Global") ? "https://graph.microsoft.com/" + : "https://microsoftgraph.chinacloudapi.cn/"; + } + + public static String getServiceManagementBaseUrl(String cloudType) { + return cloudType.equals("Global") ? "https://management.azure.com/" + : "https://management.chinacloudapi.cn/"; + } } diff --git a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/oauth2client/issuedat/AADOauth2AuthorizedClientCachedIT.java b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/oauth2client/issuedat/AADOauth2AuthorizedClientCachedIT.java index 9a535a082456c..b4836c5ec0d51 100644 --- a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/oauth2client/issuedat/AADOauth2AuthorizedClientCachedIT.java +++ b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/oauth2client/issuedat/AADOauth2AuthorizedClientCachedIT.java @@ -3,7 +3,6 @@ package com.azure.test.aad.selenium.oauth2client.issuedat; -import com.azure.spring.utils.AzureCloudUrls; import com.azure.test.aad.selenium.AADSeleniumITHelper; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; @@ -33,11 +32,11 @@ public class AADOauth2AuthorizedClientCachedIT { public void testOauth2AuthorizedClientCached() { Map properties = createDefaultProperties(); - String armClientUrl = AzureCloudUrls.getServiceManagementBaseUrl(AZURE_CLOUD_TYPE); + String armClientUrl = AADSeleniumITHelper.getServiceManagementBaseUrl(AZURE_CLOUD_TYPE); String armClientScope = armClientUrl + "user_impersonation"; properties.put("azure.activedirectory.authorization-clients.arm.scopes", armClientScope); - String graphBaseUrl = AzureCloudUrls.getGraphBaseUrl(AZURE_CLOUD_TYPE); + String graphBaseUrl = AADSeleniumITHelper.getGraphBaseUrl(AZURE_CLOUD_TYPE); properties.put("azure.activedirectory.authorization-clients.graph.scopes", graphBaseUrl + "User.Read, " + graphBaseUrl + "Directory.Read.All"); aadSeleniumITHelper = new AADSeleniumITHelper(DumbApp.class, properties); diff --git a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/oauth2client/scopes/AADAccessTokenScopesIT.java b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/oauth2client/scopes/AADAccessTokenScopesIT.java index 3eb5fac7c6a5b..79919e8b632d8 100644 --- a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/oauth2client/scopes/AADAccessTokenScopesIT.java +++ b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/oauth2client/scopes/AADAccessTokenScopesIT.java @@ -3,7 +3,6 @@ package com.azure.test.aad.selenium.oauth2client.scopes; -import com.azure.spring.utils.AzureCloudUrls; import com.azure.test.aad.selenium.AADSeleniumITHelper; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; @@ -32,10 +31,10 @@ public class AADAccessTokenScopesIT { @Test public void testAccessTokenScopes() { Map properties = createDefaultProperties(); - String armClientUrl = AzureCloudUrls.getServiceManagementBaseUrl(AZURE_CLOUD_TYPE); + String armClientUrl = AADSeleniumITHelper.getServiceManagementBaseUrl(AZURE_CLOUD_TYPE); String armClientScope = armClientUrl + "user_impersonation"; properties.put("azure.activedirectory.authorization-clients.arm.scopes", armClientScope); - String graphBaseUrl = AzureCloudUrls.getGraphBaseUrl(AZURE_CLOUD_TYPE); + String graphBaseUrl = AADSeleniumITHelper.getGraphBaseUrl(AZURE_CLOUD_TYPE); properties.put("azure.activedirectory.authorization-clients.graph.scopes", graphBaseUrl + "User.Read, " + graphBaseUrl + "Directory.Read.All"); diff --git a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java index 243bc2f877a20..7a8dd32da6c7b 100644 --- a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java +++ b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java @@ -3,7 +3,6 @@ package com.azure.test.aad.selenium.ondemand; -import com.azure.spring.utils.AzureCloudUrls; import com.azure.test.aad.selenium.AADSeleniumITHelper; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; @@ -33,7 +32,7 @@ public class AADOnDemandIT { @Test public void onDemandTest() { - String armClientUrl = AzureCloudUrls.getServiceManagementBaseUrl(AZURE_CLOUD_TYPE); + String armClientUrl = AADSeleniumITHelper.getServiceManagementBaseUrl(AZURE_CLOUD_TYPE); String armClientScope = armClientUrl + "user_impersonation"; Map properties = createDefaultProperties(); properties.put("azure.activedirectory.authorization-clients.arm.scopes", armClientScope); diff --git a/sdk/spring/azure-spring-boot-test-application/src/main/resources/application.properties b/sdk/spring/azure-spring-boot-test-application/src/main/resources/application.properties index 1a875edb98cb0..3ca1a4b8724e1 100644 --- a/sdk/spring/azure-spring-boot-test-application/src/main/resources/application.properties +++ b/sdk/spring/azure-spring-boot-test-application/src/main/resources/application.properties @@ -1,10 +1,10 @@ # Specify if Key Vault should be used to retrieve secrets. -azure.keyvault.enabled=true +spring.cloud.azure.keyvault.enabled=true # Specify the URI of your Key Vault (e.g.: https://name.vault.azure.net/). -#azure.keyvault.uri=put-your-key-vault-uri-here +#spring.cloud.azure.keyvault.uri=put-your-key-vault-uri-here # Specify the Service Principal Client ID with access to your Key Vault. -#azure.keyvault.client-id=put-your-azure-client-id-here -#azure.keyvault.client-key=put-your-azure-client-key-here +#spring.cloud.azure.keyvault.credential.client-id=put-your-azure-client-id-here +#spring.cloud.azure.keyvault.credential.client-key=put-your-azure-client-key-here # Specify the Service Principal Client Secret. diff --git a/sdk/spring/azure-spring-boot-test-cosmos/src/test/java/com/azure/test/cosmos/CosmosActuatorIT.java b/sdk/spring/azure-spring-boot-test-cosmos/src/test/java/com/azure/test/cosmos/CosmosActuatorIT.java index e17f80f515327..d1ce4a0fbeb90 100644 --- a/sdk/spring/azure-spring-boot-test-cosmos/src/test/java/com/azure/test/cosmos/CosmosActuatorIT.java +++ b/sdk/spring/azure-spring-boot-test-cosmos/src/test/java/com/azure/test/cosmos/CosmosActuatorIT.java @@ -19,10 +19,10 @@ public class CosmosActuatorIT { public void testCosmosSpringBootActuatorHealth() { try (AppRunner app = new AppRunner(DummyApp.class)) { //set properties - app.property("azure.cosmos.uri", AZURE_COSMOS_ENDPOINT); - app.property("azure.cosmos.key", AZURE_COSMOS_ACCOUNT_KEY); - app.property("azure.cosmos.database", AZURE_COSMOS_DATABASE_NAME); - app.property("azure.cosmos.populateQueryMetrics", String.valueOf(true)); + app.property("spring.cloud.azure.cosmos.uri", AZURE_COSMOS_ENDPOINT); + app.property("spring.cloud.azure.cosmos.key", AZURE_COSMOS_ACCOUNT_KEY); + app.property("spring.cloud.azure.cosmos.database", AZURE_COSMOS_DATABASE_NAME); + app.property("spring.cloud.azure.cosmos.populateQueryMetrics", String.valueOf(true)); app.property("management.endpoint.health.show-details", "always"); app.property("management.health.azure-cosmos.enabled", "true"); diff --git a/sdk/spring/azure-spring-boot-test-cosmos/src/test/java/com/azure/test/cosmos/CosmosIT.java b/sdk/spring/azure-spring-boot-test-cosmos/src/test/java/com/azure/test/cosmos/CosmosIT.java index 1f1eada24a57f..2705f41aa3b03 100644 --- a/sdk/spring/azure-spring-boot-test-cosmos/src/test/java/com/azure/test/cosmos/CosmosIT.java +++ b/sdk/spring/azure-spring-boot-test-cosmos/src/test/java/com/azure/test/cosmos/CosmosIT.java @@ -30,10 +30,10 @@ public class CosmosIT { public void testCosmosStarterIsolating() { try (AppRunner app = new AppRunner(DummyApp.class)) { //set properties - app.property("azure.cosmos.uri", AZURE_COSMOS_ENDPOINT); - app.property("azure.cosmos.key", AZURE_COSMOS_ACCOUNT_KEY); - app.property("azure.cosmos.database", AZURE_COSMOS_DATABASE_NAME); - app.property("azure.cosmos.populateQueryMetrics", String.valueOf(true)); + app.property("spring.cloud.azure.cosmos.uri", AZURE_COSMOS_ENDPOINT); + app.property("spring.cloud.azure.cosmos.key", AZURE_COSMOS_ACCOUNT_KEY); + app.property("spring.cloud.azure.cosmos.database", AZURE_COSMOS_DATABASE_NAME); + app.property("spring.cloud.azure.cosmos.populateQueryMetrics", String.valueOf(true)); //start app app.start(); @@ -46,10 +46,10 @@ public void testCosmosStarterIsolating() { public void testCosmosOperation() { try (AppRunner app = new AppRunner(DummyApp.class)) { //set properties - app.property("azure.cosmos.uri", AZURE_COSMOS_ENDPOINT); - app.property("azure.cosmos.key", AZURE_COSMOS_ACCOUNT_KEY); - app.property("azure.cosmos.database", AZURE_COSMOS_DATABASE_NAME); - app.property("azure.cosmos.populateQueryMetrics", String.valueOf(true)); + app.property("spring.cloud.azure.cosmos.uri", AZURE_COSMOS_ENDPOINT); + app.property("spring.cloud.azure.cosmos.key", AZURE_COSMOS_ACCOUNT_KEY); + app.property("spring.cloud.azure.cosmos.database", AZURE_COSMOS_DATABASE_NAME); + app.property("spring.cloud.azure.cosmos.populateQueryMetrics", String.valueOf(true)); //start app app.start(); diff --git a/sdk/spring/azure-spring-boot-test-keyvault/src/test/java/com/azure/spring/test/keyvault/KeyVaultActuatorIT.java b/sdk/spring/azure-spring-boot-test-keyvault/src/test/java/com/azure/spring/test/keyvault/KeyVaultActuatorIT.java index 7c92abfb6f984..c56e84d4c13e2 100644 --- a/sdk/spring/azure-spring-boot-test-keyvault/src/test/java/com/azure/spring/test/keyvault/KeyVaultActuatorIT.java +++ b/sdk/spring/azure-spring-boot-test-keyvault/src/test/java/com/azure/spring/test/keyvault/KeyVaultActuatorIT.java @@ -28,11 +28,11 @@ public class KeyVaultActuatorIT { public void testSpringBootActuatorHealth() { LOGGER.info("testSpringBootActuatorHealth begin."); try (AppRunner app = new AppRunner(DummyApp.class)) { - app.property("azure.keyvault.enabled", "true"); - app.property("azure.keyvault.uri", AZURE_KEYVAULT_URI); - app.property("azure.keyvault.client-id", SPRING_CLIENT_ID); - app.property("azure.keyvault.client-key", SPRING_CLIENT_SECRET); - app.property("azure.keyvault.tenant-id", SPRING_TENANT_ID); + app.property("spring.cloud.azure.keyvault.enabled", "true"); + app.property("spring.cloud.azure.keyvault.uri", AZURE_KEYVAULT_URI); + app.property("spring.cloud.azure.keyvault.credential.client-id", SPRING_CLIENT_ID); + app.property("spring.cloud.azure.keyvault.credential.client-secret", SPRING_CLIENT_SECRET); + app.property("spring.cloud.azure.keyvault.credential.tenant-id", SPRING_TENANT_ID); app.property("management.endpoint.health.show-details", "always"); app.property("management.endpoints.web.exposure.include", "*"); app.property("management.health.azure-key-vault.enabled", "true"); @@ -53,11 +53,11 @@ public void testSpringBootActuatorHealth() { public void testSpringBootActuatorEnv() { LOGGER.info("testSpringBootActuatorEnv begin."); try (AppRunner app = new AppRunner(DummyApp.class)) { - app.property("azure.keyvault.enabled", "true"); - app.property("azure.keyvault.uri", AZURE_KEYVAULT_URI); - app.property("azure.keyvault.client-id", SPRING_CLIENT_ID); - app.property("azure.keyvault.client-key", SPRING_CLIENT_SECRET); - app.property("azure.keyvault.tenant-id", SPRING_TENANT_ID); + app.property("spring.cloud.azure.keyvault.enabled", "true"); + app.property("spring.cloud.azure.keyvault.uri", AZURE_KEYVAULT_URI); + app.property("spring.cloud.azure.keyvault.credential.client-id", SPRING_CLIENT_ID); + app.property("spring.cloud.azure.keyvault.credential.client-secret", SPRING_CLIENT_SECRET); + app.property("spring.cloud.azure.keyvault.credential.tenant-id", SPRING_TENANT_ID); app.property("management.endpoint.health.show-details", "always"); app.property("management.endpoints.web.exposure.include", "*"); app.property("management.health.azure-key-vault.enabled", "true"); 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 bcaa3ba2da078..23b3a88e33847 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,11 +75,11 @@ private static TokenCredential credentials() { public void keyVaultAsPropertySource() { LOGGER.info("keyVaultAsPropertySource begin."); try (AppRunner app = new AppRunner(DummyApp.class)) { - app.property("azure.keyvault.enabled", "true"); - app.property("azure.keyvault.uri", AZURE_KEYVAULT_URI); - app.property("azure.keyvault.client-id", SPRING_CLIENT_ID); - app.property("azure.keyvault.client-key", SPRING_CLIENT_SECRET); - app.property("azure.keyvault.tenant-id", SPRING_TENANT_ID); + app.property("spring.cloud.azure.keyvault.enabled", "true"); + app.property("spring.cloud.azure.keyvault.uri", AZURE_KEYVAULT_URI); + app.property("spring.cloud.azure.keyvault.credential.client-id", SPRING_CLIENT_ID); + app.property("spring.cloud.azure.keyvault.credential.client-secret", SPRING_CLIENT_SECRET); + app.property("spring.cloud.azure.keyvault.credential.tenant-id", SPRING_TENANT_ID); LOGGER.info("app begin to start."); final ConfigurableApplicationContext dummy = app.start(); @@ -98,12 +98,12 @@ public void keyVaultAsPropertySource() { public void keyVaultAsPropertySourceWithSpecificKeys() { LOGGER.info("keyVaultAsPropertySourceWithSpecificKeys begin."); try (AppRunner app = new AppRunner(DummyApp.class)) { - app.property("azure.keyvault.enabled", "true"); - app.property("azure.keyvault.uri", AZURE_KEYVAULT_URI); - app.property("azure.keyvault.client-id", SPRING_CLIENT_ID); - app.property("azure.keyvault.client-key", SPRING_CLIENT_SECRET); - app.property("azure.keyvault.tenant-id", SPRING_TENANT_ID); - app.property("azure.keyvault.secret-keys", KEY_VAULT_SECRET_NAME); + app.property("spring.cloud.azure.keyvault.enabled", "true"); + app.property("spring.cloud.azure.keyvault.uri", AZURE_KEYVAULT_URI); + app.property("spring.cloud.azure.keyvault.credential.client-id", SPRING_CLIENT_ID); + app.property("spring.cloud.azure.keyvault.credential.client-secret", SPRING_CLIENT_SECRET); + app.property("spring.cloud.azure.keyvault.credential.tenant-id", SPRING_TENANT_ID); + app.property("spring.cloud.azure.keyvault.secret-keys", KEY_VAULT_SECRET_NAME); LOGGER.info("====" + KEY_VAULT_SECRET_NAME); app.start(); assertEquals(KEY_VAULT_SECRET_VALUE, app.getProperty(KEY_VAULT_SECRET_NAME)); diff --git a/sdk/spring/azure-spring-boot-test-keyvault/src/test/java/com/azure/spring/test/keyvault/MultipleKeyVaultsIT.java b/sdk/spring/azure-spring-boot-test-keyvault/src/test/java/com/azure/spring/test/keyvault/MultipleKeyVaultsIT.java index 215d4060e5e5f..d79d5e21179b9 100644 --- a/sdk/spring/azure-spring-boot-test-keyvault/src/test/java/com/azure/spring/test/keyvault/MultipleKeyVaultsIT.java +++ b/sdk/spring/azure-spring-boot-test-keyvault/src/test/java/com/azure/spring/test/keyvault/MultipleKeyVaultsIT.java @@ -37,12 +37,12 @@ private static String getKeyVaultName(String keyVaultUri) { @Test public void testGetValueFromKeyVault1() { try (AppRunner app = new AppRunner(TestApp.class)) { - app.property("azure.keyvault.order", KEY_VAULT_NAME_1); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".enabled", "true"); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".uri", AZURE_KEYVAULT_URI); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".client-id", SPRING_CLIENT_ID); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".client-key", SPRING_CLIENT_SECRET); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".tenant-id", SPRING_TENANT_ID); + app.property("spring.cloud.azure.keyvault.order", KEY_VAULT_NAME_1); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".enabled", "true"); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".uri", AZURE_KEYVAULT_URI); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".credential.client-id", SPRING_CLIENT_ID); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".credential.client-secret", SPRING_CLIENT_SECRET); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".credential.tenant-id", SPRING_TENANT_ID); app.start(); assertEquals(KEY_VAULT1_SECRET_VALUE, app.getProperty(KEY_VAULT1_SECRET_NAME)); } @@ -54,12 +54,12 @@ public void testGetValueFromKeyVault1() { @Test public void testGetValueFromKeyVault2() { try (AppRunner app = new AppRunner(TestApp.class)) { - app.property("azure.keyvault.order", KEY_VAULT_NAME_2); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".enabled", "true"); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".uri", AZURE_KEYVAULT2_URI); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".client-id", SPRING_CLIENT_ID); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".client-key", SPRING_CLIENT_SECRET); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".tenant-id", SPRING_TENANT_ID); + app.property("spring.cloud.azure.keyvault.order", KEY_VAULT_NAME_2); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".enabled", "true"); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".uri", AZURE_KEYVAULT2_URI); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".credential.client-id", SPRING_CLIENT_ID); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".credential.client-secret", SPRING_CLIENT_SECRET); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".credential.tenant-id", SPRING_TENANT_ID); app.start(); assertEquals(KEY_VAULT2_SECRET_VALUE, app.getProperty(KEY_VAULT2_SECRET_NAME)); } @@ -72,17 +72,17 @@ public void testGetValueFromKeyVault2() { @Test public void testGetValueForDuplicateKey() { try (AppRunner app = new AppRunner(TestApp.class)) { - app.property("azure.keyvault.order", String.join(",", KEY_VAULT_NAME_1, KEY_VAULT_NAME_2)); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".enabled", "true"); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".uri", AZURE_KEYVAULT_URI); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".client-id", SPRING_CLIENT_ID); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".client-key", SPRING_CLIENT_SECRET); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".tenant-id", SPRING_TENANT_ID); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".enabled", "true"); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".uri", AZURE_KEYVAULT2_URI); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".client-id", SPRING_CLIENT_ID); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".client-key", SPRING_CLIENT_SECRET); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".tenant-id", SPRING_TENANT_ID); + app.property("spring.cloud.azure.keyvault.order", String.join(",", KEY_VAULT_NAME_1, KEY_VAULT_NAME_2)); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".enabled", "true"); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".uri", AZURE_KEYVAULT_URI); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".credential.client-id", SPRING_CLIENT_ID); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".credential.client-secret", SPRING_CLIENT_SECRET); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".credential.tenant-id", SPRING_TENANT_ID); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".enabled", "true"); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".uri", AZURE_KEYVAULT2_URI); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".credential.client-id", SPRING_CLIENT_ID); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".credential.client-secret", SPRING_CLIENT_SECRET); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".credential.tenant-id", SPRING_TENANT_ID); app.start(); assertEquals(KEY_VAULT1_COMMON_SECRET_VALUE, app.getProperty(KEY_VAULT_COMMON_SECRET_NAME)); } @@ -94,17 +94,17 @@ public void testGetValueForDuplicateKey() { @Test public void testGetValueFromSingleVault() { try (AppRunner app = new AppRunner(TestApp.class)) { - app.property("azure.keyvault.order", String.join(",", KEY_VAULT_NAME_1, KEY_VAULT_NAME_2)); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".enabled", "true"); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".uri", AZURE_KEYVAULT_URI); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".client-id", SPRING_CLIENT_ID); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".client-key", SPRING_CLIENT_SECRET); - app.property("azure.keyvault." + KEY_VAULT_NAME_1 + ".tenant-id", SPRING_TENANT_ID); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".enabled", "true"); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".uri", AZURE_KEYVAULT2_URI); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".client-id", SPRING_CLIENT_ID); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".client-key", SPRING_CLIENT_SECRET); - app.property("azure.keyvault." + KEY_VAULT_NAME_2 + ".tenant-id", SPRING_TENANT_ID); + app.property("spring.cloud.azure.keyvault.order", String.join(",", KEY_VAULT_NAME_1, KEY_VAULT_NAME_2)); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".enabled", "true"); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".uri", AZURE_KEYVAULT_URI); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".credential.client-id", SPRING_CLIENT_ID); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".credential.client-secret", SPRING_CLIENT_SECRET); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_1 + ".credential.tenant-id", SPRING_TENANT_ID); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".enabled", "true"); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".uri", AZURE_KEYVAULT2_URI); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".credential.client-id", SPRING_CLIENT_ID); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".credential.client-secret", SPRING_CLIENT_SECRET); + app.property("spring.cloud.azure.keyvault." + KEY_VAULT_NAME_2 + ".credential.tenant-id", SPRING_TENANT_ID); app.start(); assertEquals(KEY_VAULT1_SECRET_VALUE, app.getProperty(KEY_VAULT1_SECRET_NAME)); assertEquals(KEY_VAULT2_SECRET_VALUE, app.getProperty(KEY_VAULT2_SECRET_NAME)); diff --git a/sdk/spring/azure-spring-boot-test-keyvault/test-resources.json b/sdk/spring/azure-spring-boot-test-keyvault/test-resources.json index fbd9757de7da9..31c4daaf381a7 100644 --- a/sdk/spring/azure-spring-boot-test-keyvault/test-resources.json +++ b/sdk/spring/azure-spring-boot-test-keyvault/test-resources.json @@ -86,7 +86,7 @@ "siteConfig": { "appSettings": [ { - "name": "AZURE_KEYVAULT_URI", + "name": "SPRING_CLOUD_AZURE_KEYVAULT_URI", "value": "[variables('azureKeyVaultUri')]" } ], diff --git a/sdk/spring/azure-spring-boot-test-storage/src/test/java/com/microsoft/azure/test/storage/StorageActuatorIT.java b/sdk/spring/azure-spring-boot-test-storage/src/test/java/com/microsoft/azure/test/storage/StorageActuatorIT.java index 9fcc304c1aff3..7e566aac9f47b 100644 --- a/sdk/spring/azure-spring-boot-test-storage/src/test/java/com/microsoft/azure/test/storage/StorageActuatorIT.java +++ b/sdk/spring/azure-spring-boot-test-storage/src/test/java/com/microsoft/azure/test/storage/StorageActuatorIT.java @@ -22,9 +22,9 @@ public class StorageActuatorIT { public void testBlobStorageActuatorHealth() { try (AppRunner app = new AppRunner(DummyApp.class)) { //set properties - app.property("azure.storage.account-name", AZURE_STORAGE_ACCOUNT_NAME); - app.property("azure.storage.account-key", AZURE_STORAGE_ACCOUNT_KEY); - app.property("azure.storage.blob-endpoint", AZURE_STORAGE_BLOB_ENDPOINT); + app.property("spring.cloud.azure.storage.account-name", AZURE_STORAGE_ACCOUNT_NAME); + app.property("spring.cloud.azure.storage.account-key", AZURE_STORAGE_ACCOUNT_KEY); + app.property("spring.cloud.azure.storage.blob-endpoint", AZURE_STORAGE_BLOB_ENDPOINT); app.property("blob", AZURE_STORAGE_BLOB); app.property("management.endpoint.health.show-details", "always"); app.property("management.endpoints.web.exposure.include", "*"); @@ -49,9 +49,9 @@ public void testBlobStorageActuatorHealth() { public void testFileStorageActuatorHealth() { try (AppRunner app = new AppRunner(DummyApp.class)) { //set properties - app.property("azure.storage.account-name", AZURE_STORAGE_ACCOUNT_NAME); - app.property("azure.storage.account-key", AZURE_STORAGE_ACCOUNT_KEY); - app.property("azure.storage.file-endpoint", AZURE_STORAGE_FILE_ENDPOINT); + app.property("spring.cloud.azure.storage.account-name", AZURE_STORAGE_ACCOUNT_NAME); + app.property("spring.cloud.azure.storage.account-key", AZURE_STORAGE_ACCOUNT_KEY); + app.property("spring.cloud.azure.storage.file-endpoint", AZURE_STORAGE_FILE_ENDPOINT); app.property("file", AZURE_STORAGE_FILE); app.property("management.endpoint.health.show-details", "always"); //start app diff --git a/sdk/spring/azure-spring-boot-test-storage/src/test/resources/application.properties b/sdk/spring/azure-spring-boot-test-storage/src/test/resources/application.properties index 70a9c8b979054..5e29083279fab 100644 --- a/sdk/spring/azure-spring-boot-test-storage/src/test/resources/application.properties +++ b/sdk/spring/azure-spring-boot-test-storage/src/test/resources/application.properties @@ -1,6 +1,6 @@ -azure.storage.account-name=${AZURE_STORAGE_ACCOUNT_NAME} -azure.storage.account-key=${AZURE_STORAGE_ACCOUNT_KEY} -azure.storage.blob-endpoint=${AZURE_STORAGE_BLOB_ENDPOINT} -azure.storage.file-endpoint=${AZURE_STORAGE_FILE_ENDPOINT} +spring.cloud.azure.storage.account-name=${AZURE_STORAGE_ACCOUNT_NAME} +spring.cloud.azure.storage.account-key=${AZURE_STORAGE_ACCOUNT_KEY} +spring.cloud.azure.storage.blob-endpoint=${AZURE_STORAGE_BLOB_ENDPOINT} +spring.cloud.azure.storage.file-endpoint=${AZURE_STORAGE_FILE_ENDPOINT} blob=${AZURE_STORAGE_BLOB} file=${AZURE_STORAGE_FILE} diff --git a/sdk/spring/azure-spring-boot/CHANGELOG.md b/sdk/spring/azure-spring-boot/CHANGELOG.md index 46cc2fe634e53..bc77a84251aa8 100644 --- a/sdk/spring/azure-spring-boot/CHANGELOG.md +++ b/sdk/spring/azure-spring-boot/CHANGELOG.md @@ -2,6 +2,7 @@ ## 3.7.0-beta.1 (Unreleased) + ## 3.6.1 (2021-07-02) ### New Features - Upgrade to [spring-boot-dependencies:2.5.2](https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-dependencies/2.5.2/spring-boot-dependencies-2.5.2.pom). diff --git a/sdk/spring/azure-spring-boot/pom.xml b/sdk/spring/azure-spring-boot/pom.xml index 9df688481265f..56045d2ce9e89 100644 --- a/sdk/spring/azure-spring-boot/pom.xml +++ b/sdk/spring/azure-spring-boot/pom.xml @@ -168,6 +168,13 @@ true + + + com.azure.spring + azure-spring-boot-core + 1.0.0-beta.1 + + com.azure @@ -332,18 +339,6 @@ - - org.apache.maven.plugins - maven-jar-plugin - 3.1.2 - - - - true - - - - diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/aad/AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/aad/AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter.java index d14d284bd7227..c93d516c7762f 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/aad/AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/aad/AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter.java @@ -3,7 +3,7 @@ package com.azure.spring.aad; -import com.azure.spring.utils.ApplicationId; +import com.azure.spring.core.ApplicationId; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.RequestEntity; diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/aad/webapp/AADOAuth2AuthorizationCodeGrantRequestEntityConverter.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/aad/webapp/AADOAuth2AuthorizationCodeGrantRequestEntityConverter.java index 0d773d9b99d58..5278c2f0a8df0 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/aad/webapp/AADOAuth2AuthorizationCodeGrantRequestEntityConverter.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/aad/webapp/AADOAuth2AuthorizationCodeGrantRequestEntityConverter.java @@ -3,8 +3,8 @@ package com.azure.spring.aad.webapp; +import com.azure.spring.core.ApplicationId; import com.azure.spring.aad.AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter; -import com.azure.spring.utils.ApplicationId; import org.springframework.http.RequestEntity; import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; import org.springframework.util.LinkedMultiValueMap; diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/aad/AADAuthenticationProperties.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/aad/AADAuthenticationProperties.java index 1a3554ef09b82..1aa02a9d94c62 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/aad/AADAuthenticationProperties.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/aad/AADAuthenticationProperties.java @@ -29,11 +29,12 @@ * Configuration properties for Azure Active Directory Authentication. */ @Validated -@ConfigurationProperties("azure.activedirectory") +@ConfigurationProperties(AADAuthenticationProperties.PREFIX) public class AADAuthenticationProperties implements InitializingBean { private static final long DEFAULT_JWK_SET_CACHE_LIFESPAN = TimeUnit.MINUTES.toMillis(5); private static final long DEFAULT_JWK_SET_CACHE_REFRESH_TIME = DEFAULT_JWK_SET_CACHE_LIFESPAN; + public static final String PREFIX = "azure.activedirectory"; /** * Default UserGroup configuration. diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/b2c/AADB2COAuth2AuthorizationCodeGrantRequestEntityConverter.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/b2c/AADB2COAuth2AuthorizationCodeGrantRequestEntityConverter.java index 511593549507e..27089dde1d41d 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/b2c/AADB2COAuth2AuthorizationCodeGrantRequestEntityConverter.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/b2c/AADB2COAuth2AuthorizationCodeGrantRequestEntityConverter.java @@ -4,7 +4,7 @@ package com.azure.spring.autoconfigure.b2c; import com.azure.spring.aad.AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter; -import com.azure.spring.utils.ApplicationId; +import com.azure.spring.core.ApplicationId; import org.springframework.http.RequestEntity; import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/cosmos/CosmosAutoConfiguration.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/cosmos/CosmosAutoConfiguration.java index f403bd8607f09..4797b1dce4980 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/cosmos/CosmosAutoConfiguration.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/cosmos/CosmosAutoConfiguration.java @@ -7,15 +7,19 @@ import com.azure.cosmos.ConnectionMode; import com.azure.cosmos.CosmosAsyncClient; import com.azure.cosmos.CosmosClientBuilder; +import com.azure.spring.autoconfigure.unity.AzureProperties; import com.azure.spring.data.cosmos.config.AbstractCosmosConfiguration; import com.azure.spring.data.cosmos.config.CosmosConfig; import com.azure.spring.data.cosmos.core.CosmosTemplate; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnResource; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import static com.azure.spring.autoconfigure.unity.AzureProperties.AZURE_PROPERTY_BEAN_NAME; + /** * Auto Configure Cosmos properties and connection policy. */ @@ -24,29 +28,33 @@ @ConditionalOnResource(resources = "classpath:cosmos.enable.config") @EnableConfigurationProperties(CosmosProperties.class) public class CosmosAutoConfiguration extends AbstractCosmosConfiguration { - private final CosmosProperties properties; + private final CosmosProperties cosmosProperties; + private final AzureProperties azureProperties; + - public CosmosAutoConfiguration(CosmosProperties properties) { - this.properties = properties; + public CosmosAutoConfiguration(CosmosProperties cosmosProperties, + @Qualifier(AZURE_PROPERTY_BEAN_NAME) AzureProperties azureProperties) { + this.cosmosProperties = cosmosProperties; + this.azureProperties = azureProperties; } @Override protected String getDatabaseName() { - return properties.getDatabase(); + return cosmosProperties.getDatabase(); } @Bean public AzureKeyCredential azureKeyCredential() { - return new AzureKeyCredential(properties.getKey()); + return new AzureKeyCredential(cosmosProperties.getKey()); } @Bean public CosmosClientBuilder cosmosClientBuilder(AzureKeyCredential azureKeyCredential) { CosmosClientBuilder cosmosClientBuilder = new CosmosClientBuilder(); cosmosClientBuilder.credential(azureKeyCredential) - .consistencyLevel(properties.getConsistencyLevel()) - .endpoint(properties.getUri()); - if (ConnectionMode.GATEWAY == properties.getConnectionMode()) { + .consistencyLevel(cosmosProperties.getConsistencyLevel()) + .endpoint(cosmosProperties.getUri()); + if (ConnectionMode.GATEWAY == cosmosProperties.getConnectionMode()) { cosmosClientBuilder.gatewayMode(); } return cosmosClientBuilder; @@ -55,8 +63,8 @@ public CosmosClientBuilder cosmosClientBuilder(AzureKeyCredential azureKeyCreden @Override public CosmosConfig cosmosConfig() { return CosmosConfig.builder() - .enableQueryMetrics(properties.isPopulateQueryMetrics()) - .responseDiagnosticsProcessor(properties.getResponseDiagnosticsProcessor()) + .enableQueryMetrics(cosmosProperties.isPopulateQueryMetrics()) + .responseDiagnosticsProcessor(cosmosProperties.getResponseDiagnosticsProcessor()) .build(); } } diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/cosmos/CosmosHealthIndicator.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/cosmos/CosmosHealthIndicator.java index 5bde488b7acfc..0f03d7976726e 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/cosmos/CosmosHealthIndicator.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/cosmos/CosmosHealthIndicator.java @@ -21,10 +21,10 @@ public class CosmosHealthIndicator extends AbstractHealthIndicator { private static final Logger LOGGER = LoggerFactory.getLogger(CosmosHealthIndicator.class); - @Value("${azure.cosmos.database}") + @Value("${spring.cloud.azure.cosmos.database}") private String dbName; - @Value("${azure.cosmos.uri}") + @Value("${spring.cloud.azure.cosmos.uri}") private String uri; private final CosmosAsyncClient cosmosAsyncClient; diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/cosmos/CosmosProperties.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/cosmos/CosmosProperties.java index a523ffe41d53e..b1d916e29e0f2 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/cosmos/CosmosProperties.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/cosmos/CosmosProperties.java @@ -5,6 +5,7 @@ import com.azure.cosmos.ConnectionMode; import com.azure.cosmos.ConsistencyLevel; +import com.azure.spring.autoconfigure.unity.AzureProperties; import com.azure.spring.data.cosmos.core.ResponseDiagnosticsProcessor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,10 +19,12 @@ * Configuration properties for Cosmos database, consistency, telemetry, connection, query metrics and diagnostics. */ @Validated -@ConfigurationProperties("azure.cosmos") -public class CosmosProperties { +@ConfigurationProperties(CosmosProperties.PREFIX) +public class CosmosProperties extends AzureProperties { private static final Logger LOGGER = LoggerFactory.getLogger(CosmosProperties.class); + public static final String PREFIX = "spring.cloud.azure.cosmos"; + /** * Document DB URI. */ diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/jms/AzureServiceBusJMSProperties.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/jms/AzureServiceBusJMSProperties.java index fb16f55a4be18..581ad23e42fb7 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/jms/AzureServiceBusJMSProperties.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/jms/AzureServiceBusJMSProperties.java @@ -3,6 +3,7 @@ package com.azure.spring.autoconfigure.jms; +import com.azure.spring.autoconfigure.unity.AzureProperties; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.util.StringUtils; @@ -14,8 +15,10 @@ * {@link ConfigurationProperties} for configuring Azure Service Bus JMS. */ @Validated -@ConfigurationProperties("spring.jms.servicebus") -public class AzureServiceBusJMSProperties { +@ConfigurationProperties(AzureServiceBusJMSProperties.PREFIX) +public class AzureServiceBusJMSProperties extends AzureProperties { + + public static final String PREFIX = "spring.jms.servicebus"; private String connectionString; diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/jms/NonPremiumServiceBusJMSAutoConfiguration.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/jms/NonPremiumServiceBusJMSAutoConfiguration.java index 669970a51227c..149963c7a614e 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/jms/NonPremiumServiceBusJMSAutoConfiguration.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/jms/NonPremiumServiceBusJMSAutoConfiguration.java @@ -3,7 +3,9 @@ package com.azure.spring.autoconfigure.jms; +import com.azure.spring.autoconfigure.unity.AzureProperties; import org.apache.qpid.jms.JmsConnectionFactory; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -17,6 +19,8 @@ import javax.jms.ConnectionFactory; +import static com.azure.spring.autoconfigure.unity.AzureProperties.AZURE_PROPERTY_BEAN_NAME; + /** * Automatic configuration class of ServiceBusJMS for Standard and Basic Service Bus */ @@ -32,7 +36,8 @@ public class NonPremiumServiceBusJMSAutoConfiguration { @Bean @ConditionalOnMissingBean - public ConnectionFactory jmsConnectionFactory(AzureServiceBusJMSProperties serviceBusJMSProperties) { + public ConnectionFactory jmsConnectionFactory(AzureServiceBusJMSProperties serviceBusJMSProperties, + @Qualifier(AZURE_PROPERTY_BEAN_NAME)AzureProperties azureProperties) { final String connectionString = serviceBusJMSProperties.getConnectionString(); final String clientId = serviceBusJMSProperties.getTopicClientId(); final int idleTimeout = serviceBusJMSProperties.getIdleTimeout(); diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/jms/PremiumServiceBusJMSAutoConfiguration.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/jms/PremiumServiceBusJMSAutoConfiguration.java index 7afe1471d849c..8f83e3de8f3f1 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/jms/PremiumServiceBusJMSAutoConfiguration.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/jms/PremiumServiceBusJMSAutoConfiguration.java @@ -3,8 +3,10 @@ package com.azure.spring.autoconfigure.jms; +import com.azure.spring.autoconfigure.unity.AzureProperties; import com.microsoft.azure.servicebus.jms.ServiceBusJmsConnectionFactory; import com.microsoft.azure.servicebus.jms.ServiceBusJmsConnectionFactorySettings; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -18,7 +20,9 @@ import javax.jms.ConnectionFactory; -import static com.azure.spring.utils.ApplicationId.AZURE_SPRING_SERVICE_BUS; +import static com.azure.spring.autoconfigure.unity.AzureProperties.AZURE_PROPERTY_BEAN_NAME; +import static com.azure.spring.core.ApplicationId.AZURE_SPRING_SERVICE_BUS; +import static com.azure.spring.core.ApplicationId.VERSION; /** * Automatic configuration class of ServiceBusJMS for Premium Service Bus @@ -33,7 +37,8 @@ public class PremiumServiceBusJMSAutoConfiguration { @Bean @ConditionalOnMissingBean - public ConnectionFactory jmsConnectionFactory(AzureServiceBusJMSProperties serviceBusJMSProperties) { + public ConnectionFactory jmsConnectionFactory(AzureServiceBusJMSProperties serviceBusJMSProperties, + @Qualifier(AZURE_PROPERTY_BEAN_NAME) AzureProperties azureProperties) { final String connectionString = serviceBusJMSProperties.getConnectionString(); final String clientId = serviceBusJMSProperties.getTopicClientId(); final int idleTimeout = serviceBusJMSProperties.getIdleTimeout(); @@ -44,7 +49,7 @@ public ConnectionFactory jmsConnectionFactory(AzureServiceBusJMSProperties servi final SpringServiceBusJmsConnectionFactory springServiceBusJmsConnectionFactory = new SpringServiceBusJmsConnectionFactory(connectionString, settings); springServiceBusJmsConnectionFactory.setClientId(clientId); - springServiceBusJmsConnectionFactory.setCustomUserAgent(AZURE_SPRING_SERVICE_BUS); + springServiceBusJmsConnectionFactory.setCustomUserAgent(AZURE_SPRING_SERVICE_BUS + VERSION); return springServiceBusJmsConnectionFactory; } diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/storage/StorageAutoConfiguration.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/storage/StorageAutoConfiguration.java index f91d9e391c3c3..e2f2b7e115fe7 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/storage/StorageAutoConfiguration.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/storage/StorageAutoConfiguration.java @@ -5,10 +5,11 @@ import com.azure.core.http.policy.HttpLogOptions; import com.azure.spring.autoconfigure.storage.resource.AzureStorageProtocolResolver; -import com.azure.spring.utils.ApplicationId; +import com.azure.spring.autoconfigure.unity.AzureProperties; import com.azure.storage.blob.BlobServiceClientBuilder; import com.azure.storage.common.StorageSharedKeyCredential; import com.azure.storage.file.share.ShareServiceClientBuilder; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -18,6 +19,11 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import static com.azure.spring.autoconfigure.unity.AzureProperties.AZURE_PROPERTY_BEAN_NAME; +import static com.azure.spring.core.ApplicationId.AZURE_SPRING_STORAGE_BLOB; +import static com.azure.spring.core.ApplicationId.AZURE_SPRING_STORAGE_FILES; +import static com.azure.spring.core.ApplicationId.VERSION; + /** * An auto-configuration for Azure Storage Account * @@ -32,27 +38,29 @@ public class StorageAutoConfiguration { @Bean @ConditionalOnMissingBean @ConditionalOnProperty("azure.storage.blob-endpoint") - public BlobServiceClientBuilder blobServiceClientBuilder(StorageProperties storageProperties) { + public BlobServiceClientBuilder blobServiceClientBuilder(StorageProperties storageProperties, @Qualifier( + AZURE_PROPERTY_BEAN_NAME) AzureProperties azureProperties) { final String accountName = storageProperties.getAccountName(); final String accountKey = storageProperties.getAccountKey(); return new BlobServiceClientBuilder() .endpoint(storageProperties.getBlobEndpoint()) .credential(new StorageSharedKeyCredential(accountName, accountKey)) - .httpLogOptions(new HttpLogOptions().setApplicationId(ApplicationId.AZURE_SPRING_STORAGE_BLOB)); + .httpLogOptions(new HttpLogOptions().setApplicationId(AZURE_SPRING_STORAGE_BLOB + VERSION)); } @Bean @ConditionalOnMissingBean @ConditionalOnProperty("azure.storage.file-endpoint") - public ShareServiceClientBuilder shareServiceClientBuilder(StorageProperties storageProperties) { + public ShareServiceClientBuilder shareServiceClientBuilder(StorageProperties storageProperties, @Qualifier( + AZURE_PROPERTY_BEAN_NAME) AzureProperties azureProperties) { final String accountName = storageProperties.getAccountName(); final String accountKey = storageProperties.getAccountKey(); return new ShareServiceClientBuilder() .endpoint(storageProperties.getFileEndpoint()) .credential(new StorageSharedKeyCredential(accountName, accountKey)) - .httpLogOptions(new HttpLogOptions().setApplicationId(ApplicationId.AZURE_SPRING_STORAGE_FILES)); + .httpLogOptions(new HttpLogOptions().setApplicationId(AZURE_SPRING_STORAGE_FILES + VERSION)); } @Configuration diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/storage/StorageProperties.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/storage/StorageProperties.java index 227beef3798be..76b95cc9ea9f0 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/storage/StorageProperties.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/storage/StorageProperties.java @@ -3,6 +3,7 @@ package com.azure.spring.autoconfigure.storage; +import com.azure.spring.autoconfigure.unity.AzureProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; @@ -13,8 +14,10 @@ * Storage properties. */ @Validated -@ConfigurationProperties("azure.storage") -public class StorageProperties { +@ConfigurationProperties(StorageProperties.PREFIX) +public class StorageProperties extends AzureProperties { + + public static final String PREFIX = "spring.cloud.azure.storage"; @NotEmpty @Pattern(regexp = "^[a-z0-9]{3,24}$", diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/AzureProperties.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/AzureProperties.java new file mode 100644 index 0000000000000..65731c0a33f73 --- /dev/null +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/AzureProperties.java @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.autoconfigure.unity; + +/** + * Unified properties for Azure SDK clients. + */ +public class AzureProperties { + + public static final String AZURE_PROPERTY_BEAN_NAME = "azureProperties"; + + public static final String PREFIX = "spring.cloud.azure"; + + private CredentialProperties credential; + + private EnvironmentProperties environment; + + public CredentialProperties getCredential() { + return credential; + } + + public void setCredential(CredentialProperties credential) { + this.credential = credential; + } + + public EnvironmentProperties getEnvironment() { + return environment; + } + + public void setEnvironment(EnvironmentProperties environment) { + this.environment = environment; + } +} diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/AzurePropertyAutoConfiguration.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/AzurePropertyAutoConfiguration.java new file mode 100644 index 0000000000000..321639a3078be --- /dev/null +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/AzurePropertyAutoConfiguration.java @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.autoconfigure.unity; + +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.core.env.Environment; +import org.springframework.core.type.AnnotationMetadata; + +/** + * Automatic configuration class of {@link AzureProperties} for unified configuration of Azure Spring libraries. + */ +@Import(AzurePropertyAutoConfiguration.Registrar.class) +public class AzurePropertyAutoConfiguration { + + public static final String AZURE_PROPERTY_BEAN_NAME = "azureProperties"; + + static class Registrar implements EnvironmentAware, ImportBeanDefinitionRegistrar { + private Environment environment; + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + + @Override + public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, + BeanDefinitionRegistry registry) { + if (!registry.containsBeanDefinition(AZURE_PROPERTY_BEAN_NAME)) { + registry.registerBeanDefinition(AZURE_PROPERTY_BEAN_NAME, + BeanDefinitionBuilder.genericBeanDefinition(AzureProperties.class, + () -> Binder.get(this.environment).bindOrCreate(AzureProperties.PREFIX, + AzureProperties.class)).getBeanDefinition()); + } + } + + } +} diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/AzurePropertyEnvironmentPostProcessor.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/AzurePropertyEnvironmentPostProcessor.java new file mode 100644 index 0000000000000..451d09a553a3b --- /dev/null +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/AzurePropertyEnvironmentPostProcessor.java @@ -0,0 +1,166 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.autoconfigure.unity; + +import com.azure.spring.autoconfigure.aad.AADAuthenticationProperties; +import com.azure.spring.autoconfigure.b2c.AADB2CProperties; +import com.azure.spring.autoconfigure.cosmos.CosmosProperties; +import com.azure.spring.autoconfigure.jms.AzureServiceBusJMSProperties; +import com.azure.spring.autoconfigure.storage.StorageProperties; +import com.azure.spring.keyvault.KeyVaultProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.config.ConfigFileApplicationListener; +import org.springframework.boot.context.properties.bind.Bindable; +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.PropertiesPropertySource; +import org.springframework.util.CollectionUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +/** + * TODO: Map legacy property to current spring properties. + */ +public class AzurePropertyEnvironmentPostProcessor { + + public static final int DEFAULT_ORDER = ConfigFileApplicationListener.DEFAULT_ORDER + 1; + + private static final String LEGACY_AAD_PREFIX = "azure.activedirectory"; + private static final String LEGACY_AAD_B2C_PREFIX = "azure.activedirectory.b2c"; + private static final String LEGACY_COSMOS_PREFIX = "azure.cosmos"; + private static final String LEGACY_JMS_PREFIX = "spring.jms.servicebus"; + private static final String LEGACY_STORAGE_PREFIX = "azure.storage"; + private static final String LEGACY_KEYVAULT_PREFIX = "azure.keyvault"; + + private static final Logger LOGGER = LoggerFactory.getLogger(AzurePropertyEnvironmentPostProcessor.class); + + private static final Map LEGACY_TO_CURRENT = new HashMap() { + { + put(LEGACY_AAD_PREFIX + ".clientId", AADAuthenticationProperties.PREFIX + ".credential.clientId"); + put(LEGACY_AAD_PREFIX + ".clientSecret", AADAuthenticationProperties.PREFIX + ".credential.clientSecret"); + put(LEGACY_AAD_PREFIX + ".tenantId", AADAuthenticationProperties.PREFIX + ".credential.tenantId"); + put(LEGACY_AAD_PREFIX + ".baseUri", AADAuthenticationProperties.PREFIX + ".environment.authorityHost"); + put(LEGACY_AAD_PREFIX + ".graphBaseUri", AADAuthenticationProperties.PREFIX + ".environment.graphBaseUri"); + put(LEGACY_AAD_PREFIX + ".userGroup.allowedGroupNames", AADAuthenticationProperties.PREFIX + ".userGroup" + + ".allowedGroupNames"); + put(LEGACY_AAD_PREFIX + ".userGroup.allowedGroupIds", AADAuthenticationProperties.PREFIX + ".userGroup" + + ".allowedGroupIds"); + put(LEGACY_AAD_PREFIX + ".userGroup.enableFullList", AADAuthenticationProperties.PREFIX + ".userGroup" + + ".enableFullList"); + put(LEGACY_AAD_PREFIX + ".userNameAttribute", AADAuthenticationProperties.PREFIX + + ".userNameAttribute"); + put(LEGACY_AAD_PREFIX + ".redirectUriTemplate", AADAuthenticationProperties.PREFIX + + ".redirectUriTemplate"); + put(LEGACY_AAD_PREFIX + ".appIdUri", AADAuthenticationProperties.PREFIX + ".appIdUri"); + put(LEGACY_AAD_PREFIX + ".authenticateAdditionalParameters", + AADAuthenticationProperties.PREFIX + ".authenticateAdditionalParameters"); + put(LEGACY_AAD_PREFIX + ".jwtConnectTimeout", AADAuthenticationProperties.PREFIX + ".jwtConnectTimeout"); + put(LEGACY_AAD_PREFIX + ".jwtReadTimeout", AADAuthenticationProperties.PREFIX + ".jwtReadTimeout"); + put(LEGACY_AAD_PREFIX + ".jwtSizeLimit", AADAuthenticationProperties.PREFIX + ".jwtSizeLimit"); + put(LEGACY_AAD_PREFIX + ".jwkSetCacheLifespan", AADAuthenticationProperties.PREFIX + + ".jwkSetCacheLifespan"); + put(LEGACY_AAD_PREFIX + ".jwkSetCacheRefreshTime", AADAuthenticationProperties.PREFIX + + ".jwkSetCacheRefreshTime"); + put(LEGACY_AAD_PREFIX + ".postLogoutRedirectUri", AADAuthenticationProperties.PREFIX + + ".postLogoutRedirectUri"); + put(LEGACY_AAD_PREFIX + ".allowTelemetry", AADAuthenticationProperties.PREFIX + ".allowTelemetry"); + put(LEGACY_AAD_PREFIX + ".sessionStateless", AADAuthenticationProperties.PREFIX + ".sessionStateless"); + put(LEGACY_AAD_PREFIX + ".graphMembershipUri", AADAuthenticationProperties.PREFIX + ".graphMembershipUri"); + put(LEGACY_AAD_PREFIX + ".authorizationClients", AADAuthenticationProperties.PREFIX + + ".authorizationClients"); + + put(LEGACY_AAD_B2C_PREFIX + ".clientId", AADB2CProperties.PREFIX + ".credential.clientId"); + put(LEGACY_AAD_B2C_PREFIX + ".clientSecret", AADB2CProperties.PREFIX + ".credential.clientSecret"); + put(LEGACY_AAD_B2C_PREFIX + ".tenantId", AADB2CProperties.PREFIX + ".credential.tenantId"); + put(LEGACY_AAD_B2C_PREFIX + ".baseUri", AADB2CProperties.PREFIX + ".environment.authorityHost"); + put(LEGACY_AAD_B2C_PREFIX + ".tenant", AADB2CProperties.PREFIX + ".tenant"); + put(LEGACY_AAD_B2C_PREFIX + ".appIdUri", AADB2CProperties.PREFIX + ".appIdUri"); + put(LEGACY_AAD_B2C_PREFIX + ".jwtConnectTimeout", AADB2CProperties.PREFIX + ".jwtConnectTimeout"); + put(LEGACY_AAD_B2C_PREFIX + ".jwtReadTimeout", AADB2CProperties.PREFIX + ".jwtReadTimeout"); + put(LEGACY_AAD_B2C_PREFIX + ".jwtSizeLimit", AADB2CProperties.PREFIX + ".jwtSizeLimit"); + put(LEGACY_AAD_B2C_PREFIX + ".logoutSuccessUrl", AADB2CProperties.PREFIX + ".logoutSuccessUrl"); + put(LEGACY_AAD_B2C_PREFIX + ".authenticateAdditionalParameters", AADB2CProperties.PREFIX + + ".authenticateAdditionalParameters"); + put(LEGACY_AAD_B2C_PREFIX + ".userNameAttributeName", AADB2CProperties.PREFIX + ".userNameAttributeName"); + put(LEGACY_AAD_B2C_PREFIX + ".allowTelemetry", AADB2CProperties.PREFIX + ".allowTelemetry"); + put(LEGACY_AAD_B2C_PREFIX + ".replyUrl", AADB2CProperties.PREFIX + ".replyUrl"); + put(LEGACY_AAD_B2C_PREFIX + ".loginFlow", AADB2CProperties.PREFIX + ".loginFlow"); + put(LEGACY_AAD_B2C_PREFIX + ".userFlows", AADB2CProperties.PREFIX + ".userFlows"); + put(LEGACY_AAD_B2C_PREFIX + ".authorizationClients", AADB2CProperties.PREFIX + ".authorizationClients"); + + + put(LEGACY_COSMOS_PREFIX + ".uri", CosmosProperties.PREFIX + ".uri"); + put(LEGACY_COSMOS_PREFIX + ".key", CosmosProperties.PREFIX + ".key"); + put(LEGACY_COSMOS_PREFIX + ".consistencyLevel", CosmosProperties.PREFIX + ".consistencyLevel"); + put(LEGACY_COSMOS_PREFIX + ".database", CosmosProperties.PREFIX + ".database"); + put(LEGACY_COSMOS_PREFIX + ".populateQueryMetrics", CosmosProperties.PREFIX + ".populateQueryMetrics"); + put(LEGACY_COSMOS_PREFIX + ".allowTelemetry", CosmosProperties.PREFIX + ".allowTelemetry"); + put(LEGACY_COSMOS_PREFIX + ".connectionMode", CosmosProperties.PREFIX + ".connectionMode"); + put(LEGACY_COSMOS_PREFIX + ".responseDiagnosticsProcessor", CosmosProperties.PREFIX + + ".responseDiagnosticsProcessor"); + + put(LEGACY_JMS_PREFIX + ".connectionString", AzureServiceBusJMSProperties.PREFIX + ".connectionString"); + put(LEGACY_JMS_PREFIX + ".topicClientId", AzureServiceBusJMSProperties.PREFIX + ".topicClientId"); + put(LEGACY_JMS_PREFIX + ".idleTimeout", AzureServiceBusJMSProperties.PREFIX + ".idleTimeout"); + put(LEGACY_JMS_PREFIX + ".pricingTier", AzureServiceBusJMSProperties.PREFIX + ".pricingTier"); + + put(LEGACY_STORAGE_PREFIX + ".accountName", StorageProperties.PREFIX + ".accountName"); + put(LEGACY_STORAGE_PREFIX + ".blobEndpoint", StorageProperties.PREFIX + ".blobEndpoint"); + put(LEGACY_STORAGE_PREFIX + ".fileEndpoint", StorageProperties.PREFIX + ".fileEndpoint"); + put(LEGACY_STORAGE_PREFIX + ".accountKey", StorageProperties.PREFIX + ".accountKey"); + + put(LEGACY_KEYVAULT_PREFIX + ".clientId", KeyVaultProperties.PREFIX + ".credential.clientId"); + put(LEGACY_KEYVAULT_PREFIX + ".clientKey", KeyVaultProperties.PREFIX + ".credential.clientSecret"); + put(LEGACY_KEYVAULT_PREFIX + ".tenantId", KeyVaultProperties.PREFIX + ".credential.tenantId"); + put(LEGACY_KEYVAULT_PREFIX + ".certificatePath", KeyVaultProperties.PREFIX + ".credential.certificatePath"); + put(LEGACY_KEYVAULT_PREFIX + ".certificatePassword", KeyVaultProperties.PREFIX + ".credential" + + ".certificatePassword"); + put(LEGACY_KEYVAULT_PREFIX + ".order", KeyVaultProperties.PREFIX + ".order"); + put(LEGACY_KEYVAULT_PREFIX + ".uri", KeyVaultProperties.PREFIX + ".uri"); + put(LEGACY_KEYVAULT_PREFIX + ".enabled", KeyVaultProperties.PREFIX + ".enabled"); + put(LEGACY_KEYVAULT_PREFIX + ".secretKeys", KeyVaultProperties.PREFIX + ".secretKeys"); + put(LEGACY_KEYVAULT_PREFIX + ".refreshInterval", KeyVaultProperties.PREFIX + ".refreshInterval"); + put(LEGACY_KEYVAULT_PREFIX + ".allowTelemetry", KeyVaultProperties.PREFIX + ".allowTelemetry"); + put(LEGACY_KEYVAULT_PREFIX + ".caseSensitiveKeys", KeyVaultProperties.PREFIX + ".caseSensitiveKeys"); + + } + }; + + private int order = DEFAULT_ORDER; + + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } + + + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + + Properties properties = new Properties(); + + for (Map.Entry e : LEGACY_TO_CURRENT.entrySet()) { + Object value = Binder.get(environment) + .bind(e.getKey(), Bindable.of(Object.class)) + .orElse(null); + if (null != value) { + properties.put(e.getValue(), value); + LOGGER.info(e.getKey() + " property detected! Use the {} instead!", e.getValue()); + } + } + + // This post-processor is called multiple times but sets the properties only once. + if (!CollectionUtils.isEmpty(properties)) { + PropertiesPropertySource propertiesPropertySource = + new PropertiesPropertySource(AzurePropertyEnvironmentPostProcessor.class.getName(), properties); + environment.getPropertySources().addLast(propertiesPropertySource); + } + } +} diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/CredentialProperties.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/CredentialProperties.java new file mode 100644 index 0000000000000..b3e0b904c3ad2 --- /dev/null +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/CredentialProperties.java @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.autoconfigure.unity; + + +/** + * Azure properties used for getting token credential. + */ +public class CredentialProperties { + + /** + * Client id to use when performing service principal authentication with Azure. + */ + private String clientId; + + /** + * Client secret to use when performing service principal authentication with Azure. + */ + private String clientSecret; + + /** + * Path of a PEM certificate file to use when performing service principal authentication with Azure. + */ + private String certificatePath; + + /** + * Password of the certificate file. + */ + private String certificatePassword; + + /** + * Tenant id for the Azure resources. + */ + private String tenantId; + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getClientSecret() { + return clientSecret; + } + + public void setClientSecret(String clientSecret) { + this.clientSecret = clientSecret; + } + + public String getCertificatePath() { + return certificatePath; + } + + public void setCertificatePath(String certificatePath) { + this.certificatePath = certificatePath; + } + + public String getCertificatePassword() { + return certificatePassword; + } + + public void setCertificatePassword(String certificatePassword) { + this.certificatePassword = certificatePassword; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } +} diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/EnvironmentProperties.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/EnvironmentProperties.java new file mode 100644 index 0000000000000..606b51f2d38bd --- /dev/null +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/EnvironmentProperties.java @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +package com.azure.spring.autoconfigure.unity; + +/** + * Environment properties for endpoints in different Azure Clouds. + */ +public class EnvironmentProperties { + + private String cloud; + + private String authorityHost; + + private String graphBaseUri; + + public String getCloud() { + return cloud; + } + + public void setCloud(String cloud) { + this.cloud = cloud; + } + + public String getAuthorityHost() { + return authorityHost; + } + + public void setAuthorityHost(String authorityHost) { + this.authorityHost = authorityHost; + } + + public String getGraphBaseUri() { + return graphBaseUri; + } + + public void setGraphBaseUri(String graphBaseUri) { + this.graphBaseUri = graphBaseUri; + } + + //TODO: transfer cloud to AzureEnvironment +} diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/package-info.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/package-info.java new file mode 100644 index 0000000000000..9e0fcef114317 --- /dev/null +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/autoconfigure/unity/package-info.java @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/** + * Package com.azure.spring.autoconfigure.unity; + */ +package com.azure.spring.autoconfigure.unity; diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultEnvironmentPostProcessor.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultEnvironmentPostProcessor.java index d25ac9a0a5055..b3673511f148d 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultEnvironmentPostProcessor.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultEnvironmentPostProcessor.java @@ -3,8 +3,8 @@ package com.azure.spring.keyvault; +import com.azure.spring.autoconfigure.unity.AzurePropertyEnvironmentPostProcessor; import org.springframework.boot.SpringApplication; -import org.springframework.boot.context.config.ConfigFileApplicationListener; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.Ordered; import org.springframework.core.env.ConfigurableEnvironment; @@ -14,7 +14,7 @@ * Leverage {@link EnvironmentPostProcessor} to add Key Vault secrets as a property source. */ public class KeyVaultEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered { - public static final int DEFAULT_ORDER = ConfigFileApplicationListener.DEFAULT_ORDER + 1; + public static final int DEFAULT_ORDER = AzurePropertyEnvironmentPostProcessor.DEFAULT_ORDER + 1; private int order = DEFAULT_ORDER; /** diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultEnvironmentPostProcessorHelper.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultEnvironmentPostProcessorHelper.java index c8ff4435bb441..da92c89d2be76 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultEnvironmentPostProcessorHelper.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultEnvironmentPostProcessorHelper.java @@ -5,14 +5,16 @@ import com.azure.core.credential.TokenCredential; import com.azure.core.http.policy.HttpLogOptions; +import com.azure.identity.AzureAuthorityHosts; import com.azure.identity.ClientCertificateCredentialBuilder; import com.azure.identity.ClientSecretCredentialBuilder; import com.azure.identity.ManagedIdentityCredentialBuilder; -import com.azure.identity.implementation.IdentityClientOptions; import com.azure.security.keyvault.secrets.SecretClient; import com.azure.security.keyvault.secrets.SecretClientBuilder; import com.azure.security.keyvault.secrets.SecretServiceVersion; +import com.azure.spring.autoconfigure.unity.AzureProperties; import com.azure.spring.keyvault.KeyVaultProperties.Property; +import com.google.common.annotations.VisibleForTesting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties.bind.Bindable; @@ -27,9 +29,9 @@ import java.util.List; import java.util.Optional; -import static com.azure.spring.utils.ApplicationId.AZURE_SPRING_KEY_VAULT; -import static com.azure.spring.utils.Constants.AZURE_KEYVAULT_PROPERTYSOURCE_NAME; -import static com.azure.spring.utils.Constants.DEFAULT_REFRESH_INTERVAL_MS; +import static com.azure.spring.core.ApplicationId.AZURE_SPRING_KEY_VAULT; +import static com.azure.spring.core.ApplicationId.VERSION; +import static com.azure.spring.keyvault.KeyVaultProperties.DELIMITER; import static org.springframework.core.env.StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME; /** @@ -38,8 +40,9 @@ */ class KeyVaultEnvironmentPostProcessorHelper { + public static final String AZURE_KEYVAULT_PROPERTYSOURCE_NAME = "azurekv"; + public static final long DEFAULT_REFRESH_INTERVAL_MS = 1800000L; private static final Logger LOGGER = LoggerFactory.getLogger(KeyVaultEnvironmentPostProcessorHelper.class); - private static final String DEFAULT_AUTHORITY_HOST = new IdentityClientOptions().getAuthorityHost(); private final ConfigurableEnvironment environment; KeyVaultEnvironmentPostProcessorHelper(final ConfigurableEnvironment environment) { @@ -82,7 +85,7 @@ public void addKeyVaultPropertySource(String normalizedName) { .vaultUrl(vaultUri) .credential(tokenCredential) .serviceVersion(secretServiceVersion) - .httpLogOptions(new HttpLogOptions().setApplicationId(AZURE_SPRING_KEY_VAULT)) + .httpLogOptions(new HttpLogOptions().setApplicationId(AZURE_SPRING_KEY_VAULT + VERSION)) .buildClient(); try { final MutablePropertySources sources = this.environment.getPropertySources(); @@ -132,16 +135,18 @@ public TokenCredential getCredentials() { public TokenCredential getCredentials(String normalizedName) { //use service principle to authenticate final String clientId = getPropertyValue(normalizedName, Property.CLIENT_ID); - final String clientKey = getPropertyValue(normalizedName, Property.CLIENT_KEY); + final String clientSecret = Optional.ofNullable(getPropertyValue(normalizedName, Property.CLIENT_SECRET)) + .orElse(getPropertyValue(normalizedName, Property.CLIENT_KEY)); final String tenantId = getPropertyValue(normalizedName, Property.TENANT_ID); final String certificatePath = getPropertyValue(normalizedName, Property.CERTIFICATE_PATH); final String certificatePassword = getPropertyValue(normalizedName, Property.CERTIFICATE_PASSWORD); - final String authorityHost = getPropertyValue(normalizedName, Property.AUTHORITY_HOST, DEFAULT_AUTHORITY_HOST); - if (clientId != null && tenantId != null && clientKey != null) { + final String authorityHost = Optional.ofNullable(getPropertyValue(normalizedName, Property.AUTHORITY_HOST)) + .orElse(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD); + if (clientId != null && tenantId != null && clientSecret != null) { LOGGER.debug("Will use custom credentials"); return new ClientSecretCredentialBuilder() .clientId(clientId) - .clientSecret(clientKey) + .clientSecret(clientSecret) .tenantId(tenantId) .authorityHost(authorityHost) .build(); @@ -174,13 +179,18 @@ public TokenCredential getCredentials(String normalizedName) { return new ManagedIdentityCredentialBuilder().build(); } - private String getPropertyValue(final String normalizedName, final Property property) { - return getPropertyValue(normalizedName, property, null); - } + @VisibleForTesting + String getPropertyValue(final String normalizedName, final Property property) { + List propertyNames = Arrays.asList(KeyVaultProperties.getPropertyName(normalizedName, property), + AzureProperties.PREFIX + DELIMITER + property.getName()); - private String getPropertyValue(final String normalizedName, final Property property, String defaultValue) { - return Optional.of(KeyVaultProperties.getPropertyName(normalizedName, property)) - .map(environment::getProperty) - .orElse(defaultValue); + String propertyValue = null; + for (String key : propertyNames) { + propertyValue = environment.getProperty(key); + if (null != propertyValue) { + break; + } + } + return propertyValue; } } diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultProperties.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultProperties.java index 9d396e278770b..944e730fa8ba5 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultProperties.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultProperties.java @@ -3,62 +3,26 @@ package com.azure.spring.keyvault; -import com.azure.spring.utils.Constants; +import com.azure.spring.autoconfigure.unity.AzureProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.DeprecatedConfigurationProperty; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.springframework.boot.context.properties.DeprecatedConfigurationProperty; /** * KeyVaultProperties */ @ConfigurationProperties(value = KeyVaultProperties.PREFIX) -public class KeyVaultProperties { - - public static final String PREFIX = "azure.keyvault"; - public static final String DELIMITER = "."; - - public String getClientId() { - return clientId; - } - - public void setClientId(String clientId) { - this.clientId = clientId; - } - - public String getClientKey() { - return clientKey; - } +public class KeyVaultProperties extends AzureProperties { - public void setClientKey(String clientKey) { - this.clientKey = clientKey; - } + private static final Logger LOGGER = LoggerFactory.getLogger(KeyVaultProperties.class); - public String getTenantId() { - return tenantId; - } - - public void setTenantId(String tenantId) { - this.tenantId = tenantId; - } - - public String getCertificatePath() { - return certificatePath; - } - - public void setCertificatePath(String certificatePath) { - this.certificatePath = certificatePath; - } - - public String getCertificatePassword() { - return certificatePassword; - } - - public void setCertificatePassword(String certificatePassword) { - this.certificatePassword = certificatePassword; - } + public static final String PREFIX = "spring.cloud.azure.keyvault"; + public static final String DELIMITER = "."; public Boolean getEnabled() { return enabled; @@ -121,40 +85,38 @@ public void setAllowTelemetry(String allowTelemetry) { private Boolean enabled; private List secretKeys; - private Long refreshInterval = Constants.DEFAULT_REFRESH_INTERVAL_MS; + private Long refreshInterval = KeyVaultEnvironmentPostProcessorHelper.DEFAULT_REFRESH_INTERVAL_MS; private String allowTelemetry; /** * Defines the constant for the property that enables/disables case sensitive keys. */ private String caseSensitiveKeys; - private String certificatePassword; - private String certificatePath; - private String clientId; - private String clientKey; + /** * The constant used to define the order of the key vaults you are * delivering (comma delimited, e.g 'my-vault, my-vault-2'). */ private String order; - private String tenantId; + private String uri; /** * enum Property */ public enum Property { - CASE_SENSITIVE_KEYS("case-sensitive-keys"), - CERTIFICATE_PASSWORD("certificate-password"), - AUTHORITY_HOST("authority-host"), + AUTHORITY_HOST("environment.authority-host"), + CLIENT_ID("credential.client-id"), + CLIENT_SECRET("credential.client-secret"), + CERTIFICATE_PATH("credential.certificate-path"), + CERTIFICATE_PASSWORD("credential.certificate-password"), + TENANT_ID("credential.tenant-id"), SECRET_SERVICE_VERSION("secret-service-version"), - CERTIFICATE_PATH("certificate-path"), - CLIENT_ID("client-id"), + CASE_SENSITIVE_KEYS("case-sensitive-keys"), CLIENT_KEY("client-key"), ENABLED("enabled"), ORDER("order"), REFRESH_INTERVAL("refresh-interval"), SECRET_KEYS("secret-keys"), - TENANT_ID("tenant-id"), URI("uri"); private final String name; diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultPropertySource.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultPropertySource.java index 4d59acdb3d7ed..a90fd5344d061 100644 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultPropertySource.java +++ b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/keyvault/KeyVaultPropertySource.java @@ -5,7 +5,7 @@ import org.springframework.core.env.EnumerablePropertySource; -import static com.azure.spring.utils.Constants.AZURE_KEYVAULT_PROPERTYSOURCE_NAME; +import static com.azure.spring.keyvault.KeyVaultEnvironmentPostProcessorHelper.AZURE_KEYVAULT_PROPERTYSOURCE_NAME; /** * A key vault implementation of {@link EnumerablePropertySource} to enumerate all property pairs in Key Vault. diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/AzureCloudUrls.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/AzureCloudUrls.java deleted file mode 100644 index 351fc91c9083f..0000000000000 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/AzureCloudUrls.java +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.utils; - -/** - * Util class for Azure urls - */ -public class AzureCloudUrls { - public static String getBaseUrl(String cloudType) { - return cloudType.equals("Global") ? "https://login.microsoftonline.com/" - : "https://login.partner.microsoftonline.cn/"; - } - - public static String getGraphBaseUrl(String cloudType) { - return cloudType.equals("Global") ? "https://graph.microsoft.com/" - : "https://microsoftgraph.chinacloudapi.cn/"; - } - - public static String getServiceManagementBaseUrl(String cloudType) { - return cloudType.equals("Global") ? "https://management.azure.com/" - : "https://management.chinacloudapi.cn/"; - } -} diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/Constants.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/Constants.java deleted file mode 100644 index 5691c49d2d7b9..0000000000000 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/Constants.java +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.utils; - -/** - * Util class for Constants - */ -public class Constants { - - public static final String AZURE_KEYVAULT_PROPERTYSOURCE_NAME = "azurekv"; - - public static final long DEFAULT_REFRESH_INTERVAL_MS = 1800000L; - -} diff --git a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/PropertyLoader.java b/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/PropertyLoader.java deleted file mode 100644 index 3cb1c549cbba8..0000000000000 --- a/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/utils/PropertyLoader.java +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.utils; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -/** - * Util class to load property files. - */ -public class PropertyLoader { - private static final String PROJECT_PROPERTY_FILE = "/META-INF/project.properties"; - - private static final String TELEMETRY_CONFIG_FILE = "/telemetry.config"; - - /** - * To load a property value from the file. - * @param file The source file to load properties from. - * @param property The property name. - * @return The property value. - */ - private static String getProperty(String file, String property) { - try (InputStream inputStream = PropertyLoader.class.getResourceAsStream(file)) { - if (inputStream != null) { - final Properties properties = new Properties(); - properties.load(inputStream); - - return properties.getProperty(property); - } - } catch (IOException e) { - // Omitted - } - - return "unknown"; - } - - public static String getProjectVersion() { - return getProperty(PROJECT_PROPERTY_FILE, "project.version"); - } -} diff --git a/sdk/spring/azure-spring-boot/src/main/resources/META-INF/spring.factories b/sdk/spring/azure-spring-boot/src/main/resources/META-INF/spring.factories index c494bcfd9eb6b..2e45ae4573cf0 100644 --- a/sdk/spring/azure-spring-boot/src/main/resources/META-INF/spring.factories +++ b/sdk/spring/azure-spring-boot/src/main/resources/META-INF/spring.factories @@ -14,4 +14,5 @@ com.azure.spring.autoconfigure.jms.NonPremiumServiceBusJMSAutoConfiguration,\ com.azure.spring.autoconfigure.jms.PremiumServiceBusJMSAutoConfiguration,\ com.azure.spring.autoconfigure.storage.StorageAutoConfiguration,\ com.azure.spring.autoconfigure.storage.StorageHealthConfiguration,\ -com.azure.spring.keyvault.KeyVaultHealthConfiguration +com.azure.spring.keyvault.KeyVaultHealthConfiguration,\ +com.azure.spring.autoconfigure.unity.AzurePropertyAutoConfiguration diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/aad/AADAuthenticationFilterPropertiesTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/aad/AADAuthenticationFilterPropertiesTest.java index e412429d2d8ea..7b89407b2f230 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/aad/AADAuthenticationFilterPropertiesTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/aad/AADAuthenticationFilterPropertiesTest.java @@ -3,6 +3,8 @@ package com.azure.spring.autoconfigure.aad; +import com.azure.identity.AzureAuthorityHosts; +import com.azure.spring.autoconfigure.unity.AzureProperties; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; @@ -42,6 +44,51 @@ public void canSetProperties() { } } + @Test + @Disabled + public void loadPropertiesFromCredentialProperties() { + + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + addInlinedPropertiesToEnvironment( + context, + AzureProperties.PREFIX + ".tenant-id=azure-tenant-id", + AzureProperties.PREFIX + ".client-id=azure-client-id", + AzureProperties.PREFIX + ".authority-host=azure-authority-host", + AzureProperties.PREFIX + ".environment=AzureGermany", + AAD_PROPERTY_PREFIX + "client-id=" + TestConstants.CLIENT_ID, + AAD_PROPERTY_PREFIX + "client-secret=" + TestConstants.CLIENT_SECRET + ); + context.register(Config.class); + context.refresh(); + + final AADAuthenticationProperties properties = context.getBean(AADAuthenticationProperties.class); + + assertThat(properties.getTenantId()).isEqualTo("azure-tenant-id"); + assertThat(properties.getClientId()).isEqualTo(TestConstants.CLIENT_ID); + assertThat(properties.getClientSecret()).isEqualTo(TestConstants.CLIENT_SECRET); + assertThat(properties.getBaseUri()).isEqualTo("azure-authority-host/"); + + } + + @Test + @Disabled + public void testGetBaseUriFromEnvironment() { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + addInlinedPropertiesToEnvironment( + context, + AzureProperties.PREFIX + ".environment=AzureGermany", + AAD_PROPERTY_PREFIX + "tenant-id=azure-tenant-id", + AAD_PROPERTY_PREFIX + "client-id=" + TestConstants.CLIENT_ID, + AAD_PROPERTY_PREFIX + "client-secret=" + TestConstants.CLIENT_SECRET + ); + context.register(Config.class); + context.refresh(); + + final AADAuthenticationProperties properties = context.getBean(AADAuthenticationProperties.class); + + assertThat(properties.getBaseUri()).isEqualTo(AzureAuthorityHosts.AZURE_GERMANY); + } + private void configureAllRequiredProperties(AnnotationConfigApplicationContext context) { addInlinedPropertiesToEnvironment( context, diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/aad/AADAuthenticationFilterTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/aad/AADAuthenticationFilterTest.java index 65e2b0254c789..bac88ff2d76e2 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/aad/AADAuthenticationFilterTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/aad/AADAuthenticationFilterTest.java @@ -9,11 +9,13 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.test.context.FilteredClassLoader; +import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.security.core.Authentication; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.server.resource.BearerTokenAuthenticationToken; import javax.servlet.FilterChain; import javax.servlet.ServletException; @@ -33,7 +35,8 @@ public class AADAuthenticationFilterTest { private static final String TOKEN = "dummy-token"; - private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner() + .withClassLoader(new FilteredClassLoader(BearerTokenAuthenticationToken.class)) .withConfiguration(AutoConfigurations.of(AADAuthenticationFilterAutoConfiguration.class)); private final UserPrincipalManager userPrincipalManager; private final HttpServletRequest request; @@ -130,4 +133,21 @@ public void testAlreadyAuthenticated() throws ServletException, IOException, Par verify(userPrincipalManager, times(0)).buildUserPrincipal(TOKEN); } + @Test + @Disabled + public void testAADAuthenticationFilterAutoConfiguration() { + + this.contextRunner.withPropertyValues( + "azure.activedirectory.client-id=", "spring.cloud.azure.client-id=" + ).run(context -> assertThat(context).doesNotHaveBean(AADAuthenticationFilterAutoConfiguration.class)); + + this.contextRunner.withPropertyValues( + "azure.activedirectory.client-id=" + TestConstants.CLIENT_ID + ).run(context -> assertThat(context).hasSingleBean(AADAuthenticationFilterAutoConfiguration.class)); + + this.contextRunner.withPropertyValues( + "spring.cloud.azure.client-id=" + TestConstants.CLIENT_ID + ).run(context -> assertThat(context).hasSingleBean(AADAuthenticationFilterAutoConfiguration.class)); + + } } diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/b2c/AADB2CAutoConfigurationTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/b2c/AADB2CAutoConfigurationTest.java index bd3dc518dee1b..97d46694e750f 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/b2c/AADB2CAutoConfigurationTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/b2c/AADB2CAutoConfigurationTest.java @@ -2,8 +2,10 @@ // Licensed under the MIT License. package com.azure.spring.autoconfigure.b2c; +import com.azure.spring.autoconfigure.unity.CredentialProperties; import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import org.mockito.Mockito; @@ -64,6 +66,24 @@ public void testAutoConfigurationBean() { }); } + @Test + @Disabled + public void testAutoConfigurationBeanWithCredentialProperties() { + new WebApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(WebOAuth2ClientApp.class, AADB2CAutoConfiguration.class)) + .withClassLoader(new FilteredClassLoader(BearerTokenAuthenticationToken.class)) + .withPropertyValues("spring.cloud.azure.client-id=fake-client-id", + String.format("%s=%s", AADB2CConstants.CLIENT_SECRET, AADB2CConstants.TEST_CLIENT_SECRET), + String.format("%s.%s=%s", AADB2CConstants.USER_FLOWS, + AADB2CConstants.TEST_KEY_SIGN_UP_OR_IN, AADB2CConstants.TEST_SIGN_UP_OR_IN_NAME), + String.format("%s=%s", AADB2CConstants.BASE_URI, AADB2CConstants.TEST_BASE_URI) + ).run(c -> { + final AADB2CAutoConfiguration autoConfig = c.getBean(AADB2CAutoConfiguration.class); + + Assertions.assertNotNull(autoConfig); + }); + } + @Test public void testPropertiesBean() { getDefaultContextRunner().run(c -> { @@ -89,6 +109,31 @@ public void testPropertiesBean() { }); } + @Test + @Disabled + public void testCredentialPropertiesBean() { + new WebApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(WebOAuth2ClientApp.class, AADB2CAutoConfiguration.class)) + .withClassLoader(new FilteredClassLoader(BearerTokenAuthenticationToken.class)) + .withPropertyValues("spring.cloud.azure.tenant-id=fake-tenant-id", + "spring.cloud.azure.client-id=fake-client-id", + String.format("%s.%s=%s", AADB2CConstants.USER_FLOWS, + AADB2CConstants.TEST_KEY_SIGN_UP_OR_IN, AADB2CConstants.TEST_SIGN_UP_OR_IN_NAME), + String.format("%s=%s", AADB2CConstants.CLIENT_ID, AADB2CConstants.TEST_CLIENT_ID), + String.format("%s=%s", AADB2CConstants.CLIENT_SECRET, AADB2CConstants.TEST_CLIENT_SECRET), + String.format("%s=%s", AADB2CConstants.BASE_URI, AADB2CConstants.TEST_BASE_URI) + ).run(c -> { + final AADB2CProperties properties = c.getBean(AADB2CProperties.class); + final CredentialProperties credentialProperties = c.getBean(CredentialProperties.class); + + Assertions.assertNotNull(properties); + Assertions.assertNotNull(credentialProperties); + Assertions.assertEquals(properties.getClientId(), AADB2CConstants.TEST_CLIENT_ID); + Assertions.assertEquals(properties.getClientSecret(), AADB2CConstants.TEST_CLIENT_SECRET); + Assertions.assertEquals(properties.getTenantId(), "fake-tenant-id"); + }); + } + @Test public void testAADB2CAuthorizationRequestResolverBean() { getDefaultContextRunner().run(c -> { diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/cosmos/CosmosAutoConfigurationTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/cosmos/CosmosAutoConfigurationTest.java index f01aaaeab29c9..5b69f88667f96 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/cosmos/CosmosAutoConfigurationTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/cosmos/CosmosAutoConfigurationTest.java @@ -5,19 +5,26 @@ import com.azure.core.credential.AzureKeyCredential; import com.azure.cosmos.CosmosAsyncClient; import com.azure.cosmos.CosmosClientBuilder; +import com.azure.spring.autoconfigure.unity.AzurePropertyAutoConfiguration; +import com.azure.spring.autoconfigure.unity.AzureProperties; import com.azure.spring.data.cosmos.config.CosmosConfig; import com.azure.spring.data.cosmos.core.CosmosTemplate; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; +import static com.azure.spring.autoconfigure.cosmos.PropertySettingUtil.CLOUD; import static com.azure.spring.autoconfigure.cosmos.PropertySettingUtil.DATABASE_NAME; import static com.azure.spring.autoconfigure.cosmos.PropertySettingUtil.KEY; +import static com.azure.spring.autoconfigure.cosmos.PropertySettingUtil.CLIENT_ID; import static com.azure.spring.autoconfigure.cosmos.PropertySettingUtil.URI; -import static com.azure.spring.autoconfigure.cosmos.PropertySettingUtil.getCommonPropertyValues; +import static com.azure.spring.autoconfigure.cosmos.PropertySettingUtil.getCosmosPropertyValues; +import static com.azure.spring.autoconfigure.cosmos.PropertySettingUtil.getUnifiedPropertyValues; +import static com.azure.spring.autoconfigure.unity.AzureProperties.AZURE_PROPERTY_BEAN_NAME; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -28,7 +35,7 @@ public class CosmosAutoConfigurationTest { @Test public void testCosmosAutoConfigurationWithoutEnableConfigFile() { this.contextRunner - .withConfiguration(AutoConfigurations.of(CosmosAutoConfiguration.class)) + .withConfiguration(AutoConfigurations.of(CosmosAutoConfiguration.class, AzurePropertyAutoConfiguration.class)) .withClassLoader(new FilteredClassLoader(new ClassPathResource("cosmos.enable.config"))) .run((context) -> { assertThat(context).doesNotHaveBean(CosmosConfig.class); @@ -38,7 +45,7 @@ public void testCosmosAutoConfigurationWithoutEnableConfigFile() { @Test public void testCosmosAutoConfigurationWithoutConditionalOnClass() { this.contextRunner - .withConfiguration(AutoConfigurations.of(CosmosAutoConfiguration.class)) + .withConfiguration(AutoConfigurations.of(CosmosAutoConfiguration.class, AzurePropertyAutoConfiguration.class)) .withClassLoader(new FilteredClassLoader(CosmosAsyncClient.class, CosmosTemplate.class)) .run((context) -> { assertThat(context).doesNotHaveBean(CosmosConfig.class); @@ -48,27 +55,33 @@ public void testCosmosAutoConfigurationWithoutConditionalOnClass() { @Test public void testCosmosAutoConfigurationBean() { this.contextRunner - .withPropertyValues(getCommonPropertyValues()) - .withConfiguration(AutoConfigurations.of(ConfigurationWithMockCosmosAsyncClient.class)) + .withPropertyValues(getCosmosPropertyValues()) + .withPropertyValues(getUnifiedPropertyValues()) + .withConfiguration(AutoConfigurations.of(ConfigurationWithMockCosmosAsyncClient.class, AzurePropertyAutoConfiguration.class)) .run((context) -> { assertThat(context).hasSingleBean(CosmosAsyncClient.class); assertThat(context).hasSingleBean(CosmosTemplate.class); assertThat(context).hasSingleBean(AzureKeyCredential.class); assertThat(context).hasSingleBean(CosmosClientBuilder.class); assertThat(context).hasSingleBean(CosmosConfig.class); + assertThat(context).hasBean(AZURE_PROPERTY_BEAN_NAME); CosmosProperties cosmosProperties = context.getBean(CosmosProperties.class); assertThat(cosmosProperties.getUri()).isEqualTo(URI); assertThat(cosmosProperties.getKey()).isEqualTo(KEY); assertThat(cosmosProperties.getDatabase()).isEqualTo(DATABASE_NAME); + + AzureProperties azureProperties = (AzureProperties) context.getBean(AZURE_PROPERTY_BEAN_NAME); + assertThat(azureProperties.getCredential().getClientId()).isEqualTo(CLIENT_ID); + assertThat(azureProperties.getEnvironment().getCloud()).isEqualTo(CLOUD); }); } @Configuration(proxyBeanMethods = false) static class ConfigurationWithMockCosmosAsyncClient extends CosmosAutoConfiguration { - ConfigurationWithMockCosmosAsyncClient(CosmosProperties properties) { - super(properties); + ConfigurationWithMockCosmosAsyncClient(CosmosProperties cosmosProperties, @Qualifier(AZURE_PROPERTY_BEAN_NAME)AzureProperties azureProperties) { + super(cosmosProperties, azureProperties); } @Override diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/cosmos/CosmosPropertiesTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/cosmos/CosmosPropertiesTest.java index f66db34846d84..1e8b8dde08278 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/cosmos/CosmosPropertiesTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/cosmos/CosmosPropertiesTest.java @@ -24,7 +24,7 @@ public class CosmosPropertiesTest { @Test - public void canSetAllProperties() { + public void canSetProperties() { try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext()) { configureCosmosProperties(context); context.register(Config.class); @@ -36,6 +36,8 @@ public void canSetAllProperties() { assertThat(properties.getConsistencyLevel()).isEqualTo(PropertySettingUtil.CONSISTENCY_LEVEL); assertThat(properties.isPopulateQueryMetrics()).isEqualTo(PropertySettingUtil.POPULATE_QUERY_METRICS); assertThat(properties.getConnectionMode()).isEqualTo(PropertySettingUtil.CONNECTION_MODE); + assertThat(properties.getCredential().getClientId()).isEqualTo(PropertySettingUtil.CLIENT_ID); + assertThat(properties.getEnvironment().getCloud()).isEqualTo(PropertySettingUtil.CLOUD); } } @@ -62,9 +64,9 @@ public void emptySettingNotAllowed() { Collections.sort(errorStrings); final List errorStringsExpected = Arrays.asList( - "Field error in object 'azure.cosmos' on field 'database': rejected value [null];", - "Field error in object 'azure.cosmos' on field 'key': rejected value [null];", - "Field error in object 'azure.cosmos' on field 'uri': rejected value [null];" + "Field error in object 'spring.cloud.azure.cosmos' on field 'database': rejected value [null];", + "Field error in object 'spring.cloud.azure.cosmos' on field 'key': rejected value [null];", + "Field error in object 'spring.cloud.azure.cosmos' on field 'uri': rejected value [null];" ); assertThat(errorStrings.size()).isEqualTo(errorStringsExpected.size()); diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/cosmos/PropertySettingUtil.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/cosmos/PropertySettingUtil.java index 4d984289497d9..5a8d716309c10 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/cosmos/PropertySettingUtil.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/cosmos/PropertySettingUtil.java @@ -15,12 +15,18 @@ public class PropertySettingUtil { public static final boolean POPULATE_QUERY_METRICS = true; public static final ConsistencyLevel CONSISTENCY_LEVEL = ConsistencyLevel.STRONG; public static final ConnectionMode CONNECTION_MODE = ConnectionMode.DIRECT; - public static final String PROPERTY_URI = "azure.cosmos.uri"; - public static final String PROPERTY_KEY = "azure.cosmos.key"; - public static final String PROPERTY_DBNAME = "azure.cosmos.database"; - public static final String PROPERTY_CONSISTENCY_LEVEL = "azure.cosmos.consistency-level"; - public static final String PROPERTY_POPULATE_QUERY_METRICS = "azure.cosmos.populateQueryMetrics"; - public static final String PROPERTY_CONNECTION_MODE = "azure.cosmos.connection-mode"; + public static final String CLIENT_ID = "for-test-purpose"; + public static final String CLOUD = "AzureChina"; + public static final String PROPERTY_URI = "spring.cloud.azure.cosmos.uri"; + public static final String PROPERTY_KEY = "spring.cloud.azure.cosmos.key"; + public static final String PROPERTY_DBNAME = "spring.cloud.azure.cosmos.database"; + public static final String PROPERTY_CONSISTENCY_LEVEL = "spring.cloud.azure.cosmos.consistency-level"; + public static final String PROPERTY_POPULATE_QUERY_METRICS = "spring.cloud.azure.cosmos.populateQueryMetrics"; + public static final String PROPERTY_CONNECTION_MODE = "spring.cloud.azure.cosmos.connection-mode"; + public static final String PROPERTY_CLIENT_ID = "spring.cloud.azure.cosmos.credential.client-id"; + public static final String PROPERTY_CLOUD = "spring.cloud.azure.cosmos.environment.cloud"; + public static final String PROPERTY_UNIFIED_CLIENT_ID = "spring.cloud.azure.credential.client-id"; + public static final String PROPERTY_UNIFIED_CLOUD = "spring.cloud.azure.environment.cloud"; public static void configureCosmosProperties(AnnotationConfigApplicationContext context) { addInlinedPropertiesToEnvironment( @@ -30,11 +36,13 @@ public static void configureCosmosProperties(AnnotationConfigApplicationContext PROPERTY_DBNAME + "=" + DATABASE_NAME, PROPERTY_CONSISTENCY_LEVEL + "=" + CONSISTENCY_LEVEL.name(), PROPERTY_POPULATE_QUERY_METRICS + "=" + POPULATE_QUERY_METRICS, - PROPERTY_CONNECTION_MODE + "=" + CONNECTION_MODE.name() + PROPERTY_CONNECTION_MODE + "=" + CONNECTION_MODE.name(), + PROPERTY_CLIENT_ID + "=" + CLIENT_ID, + PROPERTY_CLOUD + "=" + CLOUD ); } - public static String[] getCommonPropertyValues() { + public static String[] getCosmosPropertyValues() { return new String[] { PROPERTY_URI + "=" + URI, PROPERTY_KEY + "=" + KEY, PROPERTY_DBNAME + "=" + DATABASE_NAME, @@ -43,4 +51,10 @@ public static String[] getCommonPropertyValues() { PROPERTY_CONNECTION_MODE + "=" + CONNECTION_MODE.name() }; } + + public static String[] getUnifiedPropertyValues() { + return new String[] { PROPERTY_UNIFIED_CLIENT_ID + "=" + CLIENT_ID, + PROPERTY_UNIFIED_CLOUD + "=" + CLOUD + }; + } } diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/jms/NonPremiumServiceBusJMSAutoConfigurationTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/jms/NonPremiumServiceBusJMSAutoConfigurationTest.java index 78a81597b2065..581f82e1aae33 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/jms/NonPremiumServiceBusJMSAutoConfigurationTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/jms/NonPremiumServiceBusJMSAutoConfigurationTest.java @@ -3,6 +3,8 @@ package com.azure.spring.autoconfigure.jms; +import com.azure.spring.autoconfigure.unity.AzurePropertyAutoConfiguration; +import com.azure.spring.autoconfigure.unity.AzureProperties; import org.apache.qpid.jms.JmsConnectionFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -14,6 +16,7 @@ import javax.jms.ConnectionFactory; +import static com.azure.spring.autoconfigure.unity.AzureProperties.AZURE_PROPERTY_BEAN_NAME; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -87,6 +90,24 @@ public void testAzureServiceBusJMSPropertiesConfigured() { CONNECTION_STRING); assertThat(context.getBean(AzureServiceBusJMSProperties.class).getTopicClientId()).isEqualTo("cid"); assertThat(context.getBean(AzureServiceBusJMSProperties.class).getIdleTimeout()).isEqualTo(123); + assertThat(context.getBean(AzureServiceBusJMSProperties.class).getCredential().getClientSecret()).isEqualTo("for-test-purpose"); + assertThat(context.getBean(AzureServiceBusJMSProperties.class).getEnvironment().getCloud()).isEqualTo("AzureGermany"); + } + ); + } + + @Test + public void testAzurePropertiesConfigured() { + ApplicationContextRunner contextRunner = getContextRunnerWithProperties(); + + contextRunner.run( + context -> { + assertThat(context).hasBean(AZURE_PROPERTY_BEAN_NAME); + + assertThat(((AzureProperties) context.getBean(AZURE_PROPERTY_BEAN_NAME)).getCredential().getCertificatePassword()) + .isEqualTo("for-test-purpose"); + assertThat(((AzureProperties) context.getBean(AZURE_PROPERTY_BEAN_NAME)).getEnvironment().getAuthorityHost()) + .isEqualTo("for-test-purpose"); } ); } @@ -95,7 +116,7 @@ private ApplicationContextRunner getEmptyContextRunner() { return new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(NonPremiumServiceBusJMSAutoConfiguration.class, - JmsAutoConfiguration.class)) + JmsAutoConfiguration.class, AzurePropertyAutoConfiguration.class)) .withPropertyValues( "spring.jms.servicebus.pricing-tier=basic" ); @@ -105,12 +126,16 @@ private ApplicationContextRunner getContextRunnerWithProperties() { return new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(NonPremiumServiceBusJMSAutoConfiguration.class, - JmsAutoConfiguration.class)) + JmsAutoConfiguration.class, AzurePropertyAutoConfiguration.class)) .withPropertyValues( "spring.jms.servicebus.connection-string=" + CONNECTION_STRING, "spring.jms.servicebus.topic-client-id=cid", "spring.jms.servicebus.idle-timeout=123", - "spring.jms.servicebus.pricing-tier=basic" + "spring.jms.servicebus.pricing-tier=basic", + "spring.jms.servicebus.credential.client-secret=for-test-purpose", + "spring.jms.servicebus.environment.cloud=AzureGermany", + "spring.cloud.azure.credential.certificate-password=for-test-purpose", + "spring.cloud.azure.environment.authority-host=for-test-purpose" ); } } diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/jms/PremiumServiceBusJMSAutoConfigurationTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/jms/PremiumServiceBusJMSAutoConfigurationTest.java index 7cc42d8c1137d..d5639cde4735c 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/jms/PremiumServiceBusJMSAutoConfigurationTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/jms/PremiumServiceBusJMSAutoConfigurationTest.java @@ -3,6 +3,8 @@ package com.azure.spring.autoconfigure.jms; +import com.azure.spring.autoconfigure.unity.AzurePropertyAutoConfiguration; +import com.azure.spring.autoconfigure.unity.AzureProperties; import com.microsoft.azure.servicebus.jms.ServiceBusJmsConnectionFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -14,6 +16,7 @@ import javax.jms.ConnectionFactory; +import static com.azure.spring.autoconfigure.unity.AzureProperties.AZURE_PROPERTY_BEAN_NAME; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -26,10 +29,10 @@ public class PremiumServiceBusJMSAutoConfigurationTest { public void testAzureServiceBusPremiumAutoConfiguration() { ApplicationContextRunner contextRunner = getEmptyContextRunner(); contextRunner.withPropertyValues("spring.jms.servicebus.pricing-tier=basic") - .run(context -> assertThat(context).doesNotHaveBean(AzureServiceBusJMSProperties.class)); + .run(context -> assertThat(context).doesNotHaveBean(AzureServiceBusJMSProperties.class)); contextRunner.withPropertyValues("spring.jms.servicebus.enabled=false") - .run(context -> assertThat(context).doesNotHaveBean(AzureServiceBusJMSProperties.class)); + .run(context -> assertThat(context).doesNotHaveBean(AzureServiceBusJMSProperties.class)); contextRunner.withPropertyValues("spring.jms.servicebus.connection-string=" + CONNECTION_STRING) .run(context -> assertThat(context).hasSingleBean(AzureServiceBusJMSProperties.class)); @@ -47,7 +50,7 @@ public void testAzureServiceBusJMSPropertiesConnectionStringValidation() { public void testWithoutServiceBusJMSNamespace() { ApplicationContextRunner contextRunner = getEmptyContextRunner(); contextRunner.withClassLoader(new FilteredClassLoader(ServiceBusJmsConnectionFactory.class)) - .run(context -> assertThat(context).doesNotHaveBean(AzureServiceBusJMSProperties.class)); + .run(context -> assertThat(context).doesNotHaveBean(AzureServiceBusJMSProperties.class)); } @Test @@ -73,10 +76,30 @@ public void testAzureServiceBusJMSPropertiesConfigured() { contextRunner.run( context -> { assertThat(context).hasSingleBean(AzureServiceBusJMSProperties.class); + assertThat(context).hasBean(AZURE_PROPERTY_BEAN_NAME); + assertThat(context.getBean(AzureServiceBusJMSProperties.class).getConnectionString()).isEqualTo( CONNECTION_STRING); assertThat(context.getBean(AzureServiceBusJMSProperties.class).getTopicClientId()).isEqualTo("cid"); assertThat(context.getBean(AzureServiceBusJMSProperties.class).getIdleTimeout()).isEqualTo(123); + assertThat(context.getBean(AzureServiceBusJMSProperties.class).getCredential().getClientSecret()).isEqualTo("for-test-purpose"); + assertThat(context.getBean(AzureServiceBusJMSProperties.class).getEnvironment().getCloud()).isEqualTo("AzureGermany"); + } + ); + } + + @Test + public void testAzurePropertiesConfigured() { + ApplicationContextRunner contextRunner = getContextRunnerWithProperties(); + + contextRunner.run( + context -> { + assertThat(context).hasBean(AZURE_PROPERTY_BEAN_NAME); + + assertThat(((AzureProperties) context.getBean(AZURE_PROPERTY_BEAN_NAME)).getCredential().getCertificatePassword()) + .isEqualTo("for-test-purpose"); + assertThat(((AzureProperties) context.getBean(AZURE_PROPERTY_BEAN_NAME)).getEnvironment().getAuthorityHost()) + .isEqualTo("for-test-purpose"); } ); } @@ -84,7 +107,8 @@ public void testAzureServiceBusJMSPropertiesConfigured() { private ApplicationContextRunner getEmptyContextRunner() { return new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(PremiumServiceBusJMSAutoConfiguration.class, JmsAutoConfiguration.class)) + .withConfiguration(AutoConfigurations.of(PremiumServiceBusJMSAutoConfiguration.class, + JmsAutoConfiguration.class, AzurePropertyAutoConfiguration.class)) .withPropertyValues( "spring.jms.servicebus.pricing-tier=premium" ); @@ -93,12 +117,17 @@ private ApplicationContextRunner getEmptyContextRunner() { private ApplicationContextRunner getContextRunnerWithProperties() { return new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(PremiumServiceBusJMSAutoConfiguration.class, JmsAutoConfiguration.class)) + .withConfiguration(AutoConfigurations.of(PremiumServiceBusJMSAutoConfiguration.class, + JmsAutoConfiguration.class, AzurePropertyAutoConfiguration.class)) .withPropertyValues( "spring.jms.servicebus.connection-string=" + CONNECTION_STRING, "spring.jms.servicebus.topic-client-id=cid", "spring.jms.servicebus.idle-timeout=123", - "spring.jms.servicebus.pricing-tier=premium" + "spring.jms.servicebus.pricing-tier=premium", + "spring.jms.servicebus.credential.client-secret=for-test-purpose", + "spring.jms.servicebus.environment.cloud=AzureGermany", + "spring.cloud.azure.credential.certificate-password=for-test-purpose", + "spring.cloud.azure.environment.authority-host=for-test-purpose" ); } } diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/storage/StorageAutoConfigurationTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/storage/StorageAutoConfigurationTest.java index a95a9b65702df..5e19b187f8d59 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/storage/StorageAutoConfigurationTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/storage/StorageAutoConfigurationTest.java @@ -3,6 +3,8 @@ package com.azure.spring.autoconfigure.storage; +import com.azure.spring.autoconfigure.unity.AzurePropertyAutoConfiguration; +import com.azure.spring.autoconfigure.unity.AzureProperties; import com.azure.storage.blob.BlobServiceClientBuilder; import com.azure.storage.file.share.ShareServiceClientBuilder; import org.junit.jupiter.api.Test; @@ -13,6 +15,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; +import static com.azure.spring.autoconfigure.unity.AzureProperties.AZURE_PROPERTY_BEAN_NAME; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -21,7 +24,7 @@ public class StorageAutoConfigurationTest { private ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(StorageAutoConfiguration.class)) + .withConfiguration(AutoConfigurations.of(StorageAutoConfiguration.class, AzurePropertyAutoConfiguration.class)) .withUserConfiguration(TestConfiguration.class); @Test @@ -38,22 +41,41 @@ public void testWithoutStorageClient() { @Test public void testAzureStoragePropertiesIllegal() { - this.contextRunner.withPropertyValues("azure.storage.accountName=a") + this.contextRunner.withPropertyValues("spring.cloud.azure.storage.accountName=a") .run(context -> assertThrows(IllegalStateException.class, () -> context.getBean(StorageProperties.class))); } @Test public void testAzureStoragePropertiesConfigured() { - this.contextRunner.withPropertyValues("azure.storage.account-name=acc1") - .withPropertyValues("azure.storage.account-key=key1") - .withPropertyValues("azure.storage.blob-endpoint=endpoint1") + this.contextRunner.withPropertyValues("spring.cloud.azure.storage.account-name=acc1") + .withPropertyValues("spring.cloud.azure.storage.account-key=key1") + .withPropertyValues("spring.cloud.azure.storage.blob-endpoint=endpoint1") + .withPropertyValues("spring.cloud.azure.storage.credential.client-id=for-test-purpose") + .withPropertyValues("spring.cloud.azure.storage.environment.cloud=AzureUSGovernment") .run(context -> { assertThat(context).hasSingleBean(StorageProperties.class); final StorageProperties storageProperties = context.getBean(StorageProperties.class); assertThat(storageProperties.getAccountName()).isEqualTo("acc1"); assertThat(storageProperties.getAccountKey()).isEqualTo("key1"); assertThat(storageProperties.getBlobEndpoint()).isEqualTo("endpoint1"); + assertThat(storageProperties.getCredential().getClientId()).isEqualTo("for-test-purpose"); + assertThat(storageProperties.getEnvironment().getCloud()).isEqualTo("AzureUSGovernment"); + }); + } + + @Test + public void testAzurePropertiesConfigured() { + this.contextRunner.withPropertyValues("spring.cloud.azure.credential.client-id=for-test-purpose") + .withPropertyValues("spring.cloud.azure.environment.cloud=AzureUSGovernment") + .withPropertyValues("spring.cloud.azure.storage.account-name=acc1") + .run(context -> { + assertThat(context).hasSingleBean(StorageProperties.class); + assertThat(context).hasBean(AZURE_PROPERTY_BEAN_NAME); + + final AzureProperties azureProperties = (AzureProperties) context.getBean(AZURE_PROPERTY_BEAN_NAME); + assertThat(azureProperties.getCredential().getClientId()).isEqualTo("for-test-purpose"); + assertThat(azureProperties.getEnvironment().getCloud()).isEqualTo("AzureUSGovernment"); }); } diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/storage/actuator/BlobStorageHealthIndicatorTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/storage/actuator/BlobStorageHealthIndicatorTest.java index b869f6fab4c5e..8441383cb5b49 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/storage/actuator/BlobStorageHealthIndicatorTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/storage/actuator/BlobStorageHealthIndicatorTest.java @@ -48,7 +48,7 @@ public void testWithStorageConfigurationWithConnectionUp() { .withAllowBeanDefinitionOverriding(true) .withConfiguration(AutoConfigurations.of(StorageAutoConfiguration.class, StorageHealthConfiguration.class)) .withUserConfiguration(TestConfigurationConnectionUp.class) - .withPropertyValues("azure.storage.account-name=acc1"); + .withPropertyValues("spring.cloud.azure.storage.account-name=acc1"); contextRunner.run(context -> { Health health = context.getBean("blobStorageHealthIndicator", BlobStorageHealthIndicator.class) @@ -64,7 +64,7 @@ public void testWithStorageConfigurationWithConnectionDown() { .withAllowBeanDefinitionOverriding(true) .withConfiguration(AutoConfigurations.of(StorageAutoConfiguration.class, StorageHealthConfiguration.class)) .withUserConfiguration(TestConfigurationConnectionDown.class) - .withPropertyValues("azure.storage.account-name=acc1"); + .withPropertyValues("spring.cloud.azure.storage.account-name=acc1"); contextRunner.run(context -> { Health health = context.getBean("blobStorageHealthIndicator", BlobStorageHealthIndicator.class) diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/storage/actuator/FileStorageHealthIndicatorTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/storage/actuator/FileStorageHealthIndicatorTest.java index 729f4dd396048..9567265769287 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/storage/actuator/FileStorageHealthIndicatorTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/storage/actuator/FileStorageHealthIndicatorTest.java @@ -45,7 +45,7 @@ public void testWithStorageConfigurationWithConnectionUp() { .withAllowBeanDefinitionOverriding(true) .withConfiguration(AutoConfigurations.of(StorageAutoConfiguration.class, StorageHealthConfiguration.class)) .withUserConfiguration(TestConfigurationConnectionUp.class) - .withPropertyValues("azure.storage.account-name=acc1"); + .withPropertyValues("spring.cloud.azure.storage.account-name=acc1"); contextRunner.run(context -> { Health health = context.getBean(FileStorageHealthIndicator.class).getHealth(true); Assertions.assertEquals(Status.UP, health.getStatus()); @@ -59,7 +59,7 @@ public void testWithStorageConfigurationWithConnectionDown() { .withAllowBeanDefinitionOverriding(true) .withConfiguration(AutoConfigurations.of(StorageAutoConfiguration.class, StorageHealthConfiguration.class)) .withUserConfiguration(TestConfigurationConnectionDown.class) - .withPropertyValues("azure.storage.account-name=acc1"); + .withPropertyValues("spring.cloud.azure.storage.account-name=acc1"); contextRunner.run(context -> { Health health = context.getBean(FileStorageHealthIndicator.class).getHealth(true); Assertions.assertEquals(Status.DOWN, health.getStatus()); diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/unity/AzurePropertyAutoConfigurationTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/unity/AzurePropertyAutoConfigurationTest.java new file mode 100644 index 0000000000000..ad426473d3715 --- /dev/null +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/autoconfigure/unity/AzurePropertyAutoConfigurationTest.java @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +package com.azure.spring.autoconfigure.unity; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +public class AzurePropertyAutoConfigurationTest { + private ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(AzurePropertyAutoConfiguration.class)); + + @Test + public void testAutoConfiguration() { + this.contextRunner.run(context -> { + assertThat(context).hasSingleBean(AzurePropertyAutoConfiguration.class); + assertThat(context).hasSingleBean(AzureProperties.class); + }); + } + + @Test + public void testAzureProperties() { + this.contextRunner.withPropertyValues( + "spring.cloud.azure.credential.client-id=fake-client-id", + "spring.cloud.azure.credential.client_secret=fake-client-secret", + "spring.cloud.azure.environment.authorityHost=fake-authority-host", + "spring.cloud.azure.environment.GRAPH_BASE_URI=fake-graph-base-uri" + ) + .run(context -> { + final AzureProperties azureProperties = context.getBean(AzureProperties.class); + assertThat(azureProperties.getCredential().getClientId()).isEqualTo("fake-client-id"); + assertThat(azureProperties.getCredential().getClientSecret()).isEqualTo("fake-client-secret"); + assertThat(azureProperties.getEnvironment().getAuthorityHost()).isEqualTo("fake-authority-host"); + assertThat(azureProperties.getEnvironment().getGraphBaseUri()).isEqualTo("fake-graph-base-uri"); + }); + } +} diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/keyvault/CaseSensitiveKeyVaultTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/keyvault/CaseSensitiveKeyVaultTest.java index f18385ae86748..16b256fce10eb 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/keyvault/CaseSensitiveKeyVaultTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/keyvault/CaseSensitiveKeyVaultTest.java @@ -13,7 +13,7 @@ import java.util.ArrayList; import java.util.LinkedHashMap; -import static com.azure.spring.utils.Constants.DEFAULT_REFRESH_INTERVAL_MS; +import static com.azure.spring.keyvault.KeyVaultEnvironmentPostProcessorHelper.DEFAULT_REFRESH_INTERVAL_MS; import static org.junit.jupiter.api.Assertions.assertEquals; public class CaseSensitiveKeyVaultTest { diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/keyvault/InitializerTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/keyvault/InitializerTest.java index feb169a3c1549..352c690083720 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/keyvault/InitializerTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/keyvault/InitializerTest.java @@ -3,8 +3,6 @@ package com.azure.spring.keyvault; -import com.azure.spring.utils.Constants; - import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +26,7 @@ public void testAzureKvPropertySourceNotInitialized() { final MutablePropertySources sources = ((ConfigurableEnvironment) context.getEnvironment()).getPropertySources(); - assertFalse(sources.contains(Constants.AZURE_KEYVAULT_PROPERTYSOURCE_NAME), "PropertySources should not " + assertFalse(sources.contains(KeyVaultEnvironmentPostProcessorHelper.AZURE_KEYVAULT_PROPERTYSOURCE_NAME), "PropertySources should not " + "contains azurekv when enabled=false"); } } diff --git a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/keyvault/KeyVaultEnvironmentPostProcessorTest.java b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/keyvault/KeyVaultEnvironmentPostProcessorTest.java index 076636c5f111e..8bbcd26f73c76 100644 --- a/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/keyvault/KeyVaultEnvironmentPostProcessorTest.java +++ b/sdk/spring/azure-spring-boot/src/test/java/com/azure/spring/keyvault/KeyVaultEnvironmentPostProcessorTest.java @@ -22,12 +22,18 @@ import java.util.HashMap; import java.util.Map; +import static com.azure.spring.keyvault.KeyVaultProperties.Property.AUTHORITY_HOST; import static com.azure.spring.keyvault.KeyVaultProperties.Property.CERTIFICATE_PATH; import static com.azure.spring.keyvault.KeyVaultProperties.Property.CLIENT_ID; import static com.azure.spring.keyvault.KeyVaultProperties.Property.CLIENT_KEY; +import static com.azure.spring.keyvault.KeyVaultProperties.Property.CLIENT_SECRET; +import static com.azure.spring.keyvault.KeyVaultProperties.Property.ORDER; import static com.azure.spring.keyvault.KeyVaultProperties.Property.TENANT_ID; +import static com.azure.spring.keyvault.KeyVaultProperties.Property.URI; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNull; public class KeyVaultEnvironmentPostProcessorTest { private KeyVaultEnvironmentPostProcessorHelper keyVaultEnvironmentPostProcessorHelper; @@ -84,7 +90,7 @@ public void testGetCredentialsWhenMSIEnabledInAppService() { @Test public void testGetCredentialsWhenMSIEnabledInVMWithClientId() { - testProperties.put("azure.keyvault.client-id", "aaaa-bbbb-cccc-dddd"); + testProperties.put("spring.cloud.azure.keyvault.credential.client-id", "aaaa-bbbb-cccc-dddd"); propertySources.addLast(new MapPropertySource("Test_Properties", testProperties)); keyVaultEnvironmentPostProcessorHelper = new KeyVaultEnvironmentPostProcessorHelper(environment); @@ -113,7 +119,7 @@ public void postProcessorHasConfiguredOrder() { public void postProcessorOrderConfigurable() { final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(OrderedProcessConfig.class)) - .withPropertyValues("azure.keyvault.uri=fakeuri", "azure.keyvault.enabled=true"); + .withPropertyValues("spring.cloud.azure.keyvault.uri=fakeuri", "spring.cloud.azure.keyvault.enabled=true"); contextRunner.run(context -> { assertThat("Configured order for KeyVaultEnvironmentPostProcessor is different with default order " @@ -130,13 +136,13 @@ public void postProcessorOrderConfigurable() { */ @Test public void testMultipleKeyVaults() { - testProperties.put("azure.keyvault.order", "myvault, myvault2"); - testProperties.put("azure.keyvault.myvault.client-id", "aaaa-bbbb-cccc-dddd"); - testProperties.put("azure.keyvault.myvault.client-key", "mySecret"); - testProperties.put("azure.keyvault.myvault.tenant-id", "myid"); - testProperties.put("azure.keyvault.myvault2.client-id", "aaaa-bbbb-cccc-dddd"); - testProperties.put("azure.keyvault.myvault2.client-key", "mySecret"); - testProperties.put("azure.keyvault.myvault2.tenant-id", "myid"); + testProperties.put("spring.cloud.azure.keyvault.order", "myvault, myvault2"); + testProperties.put("spring.cloud.azure.keyvault.myvault.credential.client-id", "aaaa-bbbb-cccc-dddd"); + testProperties.put("spring.cloud.azure.keyvault.myvault.credential.client-secret", "mySecret"); + testProperties.put("spring.cloud.azure.keyvault.myvault.credential.tenant-id", "myid"); + testProperties.put("spring.cloud.azure.keyvault.myvault2.credential.client-id", "aaaa-bbbb-cccc-dddd"); + testProperties.put("spring.cloud.azure.keyvault.myvault2.credential.client-secret", "mySecret"); + testProperties.put("spring.cloud.azure.keyvault.myvault2.credential.tenant-id", "myid"); propertySources.addLast(new MapPropertySource("Test_Properties", testProperties)); keyVaultEnvironmentPostProcessorHelper = new KeyVaultEnvironmentPostProcessorHelper(environment); @@ -147,6 +153,72 @@ public void testMultipleKeyVaults() { final TokenCredential credentials2 = keyVaultEnvironmentPostProcessorHelper.getCredentials("myvault2"); assertThat(credentials2, IsInstanceOf.instanceOf(ClientSecretCredential.class)); } + + @Test + public void testGetCredentialFromKeyVaultProperties() { + testProperties.put("spring.cloud.azure.keyvault.credential.client-id", "aaaa-bbbb-cccc-dddd"); + testProperties.put("spring.cloud.azure.keyvault.credential.client-secret", "mySecret"); + testProperties.put("spring.cloud.azure.keyvault.credential.tenant-id", "myid"); + propertySources.addLast(new MapPropertySource("Test_Properties", testProperties)); + keyVaultEnvironmentPostProcessorHelper = new KeyVaultEnvironmentPostProcessorHelper(environment); + + final TokenCredential credentials = keyVaultEnvironmentPostProcessorHelper.getCredentials(); + + assertThat(credentials, IsInstanceOf.instanceOf(ClientSecretCredential.class)); + } + + @Test + public void testGetCredentialFromCommonProperties() { + testProperties.put("spring.cloud.azure.credential.client-id", "fake-client-id"); + testProperties.put("spring.cloud.azure.credential.client-secret", "fake-client-secret"); + testProperties.put("spring.cloud.azure.credential.tenant-id", "fake-tenant-id"); + propertySources.addLast(new MapPropertySource("Test_Properties", testProperties)); + + keyVaultEnvironmentPostProcessorHelper = new KeyVaultEnvironmentPostProcessorHelper(environment); + + final TokenCredential credentials = keyVaultEnvironmentPostProcessorHelper.getCredentials(); + + assertThat(credentials, IsInstanceOf.instanceOf(ClientSecretCredential.class)); + } + + @Test + public void testGetPropertyValue() { + testProperties.put("spring.cloud.azure.credential.client-id", "client1"); + + testProperties.put("spring.cloud.azure.keyvault.credential.client-secret", "secret2"); + + testProperties.put("spring.cloud.azure.credential.tenant-id", "tenant1"); + testProperties.put("spring.cloud.azure.keyvault.credential.tenant-id", "tenant2"); + + testProperties.put("spring.cloud.azure.environment.authority-host", "host1"); + testProperties.put("spring.cloud.azure.keyvault.environment.authority-host", "host2"); + + testProperties.put("spring.cloud.azure.credential.certificate-path", "cert1"); + testProperties.put("spring.cloud.azure.keyvault.mykeyvault.credential.certificate-path", "cert2"); + + testProperties.put("spring.cloud.azure.keyvault.uri", "uri1"); + + propertySources.addLast(new MapPropertySource("Test_Properties", testProperties)); + + keyVaultEnvironmentPostProcessorHelper = new KeyVaultEnvironmentPostProcessorHelper(environment); + + String clientId = keyVaultEnvironmentPostProcessorHelper.getPropertyValue("", CLIENT_ID); + String clientSecert = keyVaultEnvironmentPostProcessorHelper.getPropertyValue("", CLIENT_SECRET); + String tenantId = keyVaultEnvironmentPostProcessorHelper.getPropertyValue("", TENANT_ID); + String authorityHost = keyVaultEnvironmentPostProcessorHelper.getPropertyValue("", AUTHORITY_HOST); + String certificatePath = keyVaultEnvironmentPostProcessorHelper.getPropertyValue("mykeyvault", CERTIFICATE_PATH); + String uri = keyVaultEnvironmentPostProcessorHelper.getPropertyValue("", URI); + String order = keyVaultEnvironmentPostProcessorHelper.getPropertyValue("", ORDER); + + assertEquals("client1", clientId); + assertEquals("secret2", clientSecert); + assertEquals("tenant2", tenantId); + assertNotEquals("host1", authorityHost); + assertEquals("cert2", certificatePath); + assertEquals("uri1", uri); + assertNull(order); + } + } @Configuration diff --git a/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cache/AzureRedisAutoConfiguration.java b/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cache/AzureRedisAutoConfiguration.java index 3b3eaf2624caf..d2b327ce288ed 100644 --- a/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cache/AzureRedisAutoConfiguration.java +++ b/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/cache/AzureRedisAutoConfiguration.java @@ -6,7 +6,7 @@ import com.azure.resourcemanager.AzureResourceManager; import com.azure.resourcemanager.redis.models.RedisCache; import com.azure.spring.cloud.autoconfigure.context.AzureContextAutoConfiguration; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import com.azure.spring.cloud.context.core.impl.RedisCacheManager; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -36,8 +36,8 @@ public class AzureRedisAutoConfiguration { @ConditionalOnMissingBean @Bean public RedisCacheManager redisCacheManager(AzureResourceManager azureResourceManager, - AzureProperties azureProperties) { - return new RedisCacheManager(azureResourceManager, azureProperties); + AzureContextProperties azureContextProperties) { + return new RedisCacheManager(azureResourceManager, azureContextProperties); } @ConditionalOnMissingBean diff --git a/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubAutoConfiguration.java b/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubAutoConfiguration.java index fe13afd179fb5..3964c7bf9fff9 100644 --- a/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubAutoConfiguration.java +++ b/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubAutoConfiguration.java @@ -7,8 +7,8 @@ import com.azure.messaging.eventhubs.EventHubConsumerAsyncClient; import com.azure.resourcemanager.AzureResourceManager; import com.azure.spring.cloud.autoconfigure.context.AzureContextAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import com.azure.spring.cloud.context.core.api.EnvironmentProvider; -import com.azure.spring.cloud.context.core.config.AzureProperties; import com.azure.spring.cloud.context.core.impl.EventHubNamespaceManager; import com.azure.spring.cloud.context.core.impl.StorageAccountManager; import com.azure.spring.cloud.context.core.storage.StorageConnectionStringProvider; @@ -48,16 +48,16 @@ public class AzureEventHubAutoConfiguration { @ConditionalOnMissingBean @ConditionalOnBean(AzureResourceManager.class) public EventHubNamespaceManager eventHubNamespaceManager(AzureResourceManager azureResourceManager, - AzureProperties azureProperties) { - return new EventHubNamespaceManager(azureResourceManager, azureProperties); + AzureContextProperties azureContextProperties) { + return new EventHubNamespaceManager(azureResourceManager, azureContextProperties); } @Bean @ConditionalOnMissingBean @ConditionalOnBean(AzureResourceManager.class) public StorageAccountManager storageAccountManager(AzureResourceManager azureResourceManager, - AzureProperties azureProperties) { - return new StorageAccountManager(azureResourceManager, azureProperties); + AzureContextProperties azureContextProperties) { + return new StorageAccountManager(azureResourceManager, azureContextProperties); } /** diff --git a/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubKafkaAutoConfiguration.java b/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubKafkaAutoConfiguration.java index 94d8859f57ebd..8014e3cf32ad1 100644 --- a/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubKafkaAutoConfiguration.java +++ b/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubKafkaAutoConfiguration.java @@ -9,7 +9,7 @@ import com.azure.resourcemanager.eventhubs.models.EventHubNamespace; import com.azure.resourcemanager.eventhubs.models.EventHubNamespaceAuthorizationRule; import com.azure.spring.cloud.autoconfigure.context.AzureContextAutoConfiguration; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import com.azure.spring.cloud.context.core.impl.EventHubNamespaceManager; import com.azure.spring.integration.eventhub.factory.EventHubConnectionStringProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -71,8 +71,8 @@ public KafkaProperties kafkaProperties(EventHubNamespaceManager eventHubNamespac @ConditionalOnMissingBean @ConditionalOnBean(AzureResourceManager.class) public EventHubNamespaceManager eventHubNamespaceManager(AzureResourceManager azureResourceManager, - AzureProperties azureProperties) { - return new EventHubNamespaceManager(azureResourceManager, azureProperties); + AzureContextProperties azureContextProperties) { + return new EventHubNamespaceManager(azureResourceManager, azureContextProperties); } diff --git a/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusAutoConfiguration.java b/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusAutoConfiguration.java index e35b8153733b0..79d668134ffd0 100644 --- a/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusAutoConfiguration.java +++ b/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusAutoConfiguration.java @@ -6,7 +6,7 @@ import com.azure.messaging.servicebus.ServiceBusReceivedMessage; import com.azure.resourcemanager.AzureResourceManager; import com.azure.spring.cloud.autoconfigure.context.AzureContextAutoConfiguration; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import com.azure.spring.cloud.context.core.impl.ServiceBusNamespaceManager; import com.azure.spring.integration.servicebus.factory.ServiceBusConnectionStringProvider; import org.slf4j.Logger; @@ -38,10 +38,10 @@ public class AzureServiceBusAutoConfiguration { @Bean @ConditionalOnMissingBean - @ConditionalOnBean({ AzureResourceManager.class, AzureProperties.class }) + @ConditionalOnBean({ AzureResourceManager.class, AzureContextProperties.class }) public ServiceBusNamespaceManager serviceBusNamespaceManager(AzureResourceManager azureResourceManager, - AzureProperties azureProperties) { - return new ServiceBusNamespaceManager(azureResourceManager, azureProperties); + AzureContextProperties azureContextProperties) { + return new ServiceBusNamespaceManager(azureResourceManager, azureContextProperties); } /** diff --git a/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusQueueAutoConfiguration.java b/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusQueueAutoConfiguration.java index c9460f5723c1d..8e0e7f709757d 100644 --- a/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusQueueAutoConfiguration.java +++ b/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusQueueAutoConfiguration.java @@ -4,7 +4,7 @@ package com.azure.spring.cloud.autoconfigure.servicebus; import com.azure.messaging.servicebus.ServiceBusProcessorClient; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import com.azure.spring.cloud.context.core.impl.ServiceBusNamespaceManager; import com.azure.spring.cloud.context.core.impl.ServiceBusQueueManager; import com.azure.spring.integration.servicebus.converter.ServiceBusMessageConverter; @@ -41,8 +41,8 @@ public class AzureServiceBusQueueAutoConfiguration { @Bean @ConditionalOnMissingBean @ConditionalOnBean(ServiceBusNamespaceManager.class) - public ServiceBusQueueManager serviceBusQueueManager(AzureProperties azureProperties) { - return new ServiceBusQueueManager(azureProperties); + public ServiceBusQueueManager serviceBusQueueManager(AzureContextProperties azureContextProperties) { + return new ServiceBusQueueManager(azureContextProperties); } @Bean diff --git a/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusTopicAutoConfiguration.java b/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusTopicAutoConfiguration.java index b2c1ed1a472ec..d4ca7c95365e5 100644 --- a/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusTopicAutoConfiguration.java +++ b/sdk/spring/azure-spring-cloud-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusTopicAutoConfiguration.java @@ -4,7 +4,7 @@ package com.azure.spring.cloud.autoconfigure.servicebus; import com.azure.messaging.servicebus.ServiceBusProcessorClient; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import com.azure.spring.cloud.context.core.impl.ServiceBusNamespaceManager; import com.azure.spring.cloud.context.core.impl.ServiceBusTopicManager; import com.azure.spring.cloud.context.core.impl.ServiceBusTopicSubscriptionManager; @@ -42,15 +42,15 @@ public class AzureServiceBusTopicAutoConfiguration { @Bean @ConditionalOnMissingBean @ConditionalOnBean(ServiceBusNamespaceManager.class) - public ServiceBusTopicManager serviceBusTopicManager(AzureProperties azureProperties) { - return new ServiceBusTopicManager(azureProperties); + public ServiceBusTopicManager serviceBusTopicManager(AzureContextProperties azureContextProperties) { + return new ServiceBusTopicManager(azureContextProperties); } @Bean @ConditionalOnMissingBean @ConditionalOnBean(ServiceBusTopicManager.class) - public ServiceBusTopicSubscriptionManager serviceBusTopicSubscriptionManager(AzureProperties azureProperties) { - return new ServiceBusTopicSubscriptionManager(azureProperties); + public ServiceBusTopicSubscriptionManager serviceBusTopicSubscriptionManager(AzureContextProperties azureContextProperties) { + return new ServiceBusTopicSubscriptionManager(azureContextProperties); } @Bean diff --git a/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubAutoConfigurationTest.java b/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubAutoConfigurationTest.java index 67c919af2a89d..b841d9211ed6b 100644 --- a/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubAutoConfigurationTest.java +++ b/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubAutoConfigurationTest.java @@ -10,7 +10,7 @@ import com.azure.resourcemanager.storage.models.StorageAccount; import com.azure.resourcemanager.storage.models.StorageAccountKey; import com.azure.resourcemanager.storage.models.StorageAccounts; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import com.azure.spring.cloud.context.core.impl.EventHubNamespaceManager; import com.azure.spring.cloud.context.core.impl.StorageAccountManager; import com.azure.spring.integration.eventhub.api.EventHubClientFactory; @@ -28,10 +28,10 @@ import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.junit.jupiter.api.Assertions.assertThrows; public class AzureEventHubAutoConfigurationTest { @@ -106,7 +106,7 @@ public void testResourceManagerProvided() { } @Configuration - @EnableConfigurationProperties(AzureProperties.class) + @EnableConfigurationProperties(AzureContextProperties.class) public static class TestConfigWithAzureResourceManagerAndConnectionProvider { @Bean diff --git a/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubKafkaAutoConfigurationTest.java b/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubKafkaAutoConfigurationTest.java index 4159ba5c8e97f..bdf971c962b2e 100644 --- a/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubKafkaAutoConfigurationTest.java +++ b/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/eventhub/AzureEventHubKafkaAutoConfigurationTest.java @@ -13,7 +13,7 @@ import com.azure.resourcemanager.eventhubs.models.EventHubNamespace; import com.azure.resourcemanager.eventhubs.models.EventHubNamespaceAuthorizationRule; import com.azure.resourcemanager.eventhubs.models.EventHubNamespaces; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -82,7 +82,7 @@ public void testAzureEventHubPropertiesConfigured() { } @Configuration - @EnableConfigurationProperties(AzureProperties.class) + @EnableConfigurationProperties(AzureContextProperties.class) public static class TestConfigurationWithResourceManager { @Bean diff --git a/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusAutoConfigurationTest.java b/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusAutoConfigurationTest.java index 7dec206618480..9774645642363 100644 --- a/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusAutoConfigurationTest.java +++ b/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusAutoConfigurationTest.java @@ -6,7 +6,7 @@ import com.azure.core.amqp.AmqpTransportType; import com.azure.messaging.servicebus.ServiceBusReceivedMessage; import com.azure.resourcemanager.AzureResourceManager; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import com.azure.spring.cloud.context.core.impl.ServiceBusNamespaceManager; import com.azure.spring.integration.servicebus.factory.ServiceBusConnectionStringProvider; import org.junit.jupiter.api.Test; @@ -105,7 +105,7 @@ public void testWithAzureResourceManagerProvided() { @Configuration @Import(AzureServiceBusAutoConfiguration.class) - @EnableConfigurationProperties(AzureProperties.class) + @EnableConfigurationProperties(AzureContextProperties.class) public static class TestConfigWithAzureResourceManager { @Bean diff --git a/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusQueueAutoConfigurationTest.java b/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusQueueAutoConfigurationTest.java index d5d793ca7cb2f..7df07968c87e9 100644 --- a/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusQueueAutoConfigurationTest.java +++ b/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusQueueAutoConfigurationTest.java @@ -5,7 +5,7 @@ import com.azure.messaging.servicebus.ServiceBusProcessorClient; import com.azure.resourcemanager.AzureResourceManager; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import com.azure.spring.cloud.context.core.impl.ServiceBusNamespaceManager; import com.azure.spring.cloud.context.core.impl.ServiceBusQueueManager; import com.azure.spring.integration.servicebus.converter.ServiceBusMessageConverter; @@ -159,7 +159,7 @@ public void testMessageConverterProvided() { } @Configuration - @EnableConfigurationProperties(AzureProperties.class) + @EnableConfigurationProperties(AzureContextProperties.class) public static class TestConfigWithServiceBusNamespaceManager { @Bean @@ -181,7 +181,7 @@ public ServiceBusConnectionStringProvider serviceBusConnectionStringProvider() { } @Configuration - @EnableConfigurationProperties(AzureProperties.class) + @EnableConfigurationProperties(AzureContextProperties.class) public static class TestConfigWithAzureResourceManager { @Bean @@ -192,7 +192,7 @@ public AzureResourceManager azureResourceManager() { } @Configuration - @EnableConfigurationProperties(AzureProperties.class) + @EnableConfigurationProperties(AzureContextProperties.class) public static class TestConfigWithMessageConverter { @Bean diff --git a/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusTopicAutoConfigurationTest.java b/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusTopicAutoConfigurationTest.java index e23b0df30e758..711ff58bcd9dd 100644 --- a/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusTopicAutoConfigurationTest.java +++ b/sdk/spring/azure-spring-cloud-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/servicebus/AzureServiceBusTopicAutoConfigurationTest.java @@ -5,7 +5,7 @@ import com.azure.messaging.servicebus.ServiceBusProcessorClient; import com.azure.resourcemanager.AzureResourceManager; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import com.azure.spring.cloud.context.core.impl.ServiceBusNamespaceManager; import com.azure.spring.cloud.context.core.impl.ServiceBusTopicManager; import com.azure.spring.cloud.context.core.impl.ServiceBusTopicSubscriptionManager; @@ -138,7 +138,7 @@ public void testMessageConverterProvided() { } @Configuration - @EnableConfigurationProperties(AzureProperties.class) + @EnableConfigurationProperties(AzureContextProperties.class) public static class TestConfigWithServiceBusNamespaceManager { @Bean @@ -160,7 +160,7 @@ public ServiceBusConnectionStringProvider serviceBusConnectionStringProvider() { } @Configuration - @EnableConfigurationProperties(AzureProperties.class) + @EnableConfigurationProperties(AzureContextProperties.class) public static class TestConfigWithAzureResourceManager { @Bean @@ -172,7 +172,7 @@ public AzureResourceManager azureResourceManager() { } @Configuration - @EnableConfigurationProperties(AzureProperties.class) + @EnableConfigurationProperties(AzureContextProperties.class) public static class TestConfigWithMessageConverter { @Bean diff --git a/sdk/spring/azure-spring-cloud-context/CHANGELOG.md b/sdk/spring/azure-spring-cloud-context/CHANGELOG.md index 5556ce355176b..df67010233e17 100644 --- a/sdk/spring/azure-spring-cloud-context/CHANGELOG.md +++ b/sdk/spring/azure-spring-cloud-context/CHANGELOG.md @@ -2,7 +2,6 @@ ## 2.7.0-beta.1 (Unreleased) - ## 2.6.0 (2021-06-23) ### Breaking Changes - Remove `azure-spring-cloud-telemetry` module dependency. diff --git a/sdk/spring/azure-spring-cloud-context/pom.xml b/sdk/spring/azure-spring-cloud-context/pom.xml index 3793598f88837..1efea8bf66132 100644 --- a/sdk/spring/azure-spring-cloud-context/pom.xml +++ b/sdk/spring/azure-spring-cloud-context/pom.xml @@ -62,8 +62,9 @@ com.azure.spring - azure-identity-spring - 1.7.0-beta.1 + azure-spring-boot-core + 1.0.0-beta.1 + diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureContextAutoConfiguration.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureContextAutoConfiguration.java index ccc7b550085c6..1174153bf0895 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureContextAutoConfiguration.java +++ b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureContextAutoConfiguration.java @@ -7,7 +7,7 @@ import com.azure.core.management.profile.AzureProfile; import com.azure.resourcemanager.AzureResourceManager; import com.azure.spring.cloud.context.core.api.CredentialsProvider; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.context.core.api.EnvironmentProvider; import com.azure.spring.cloud.context.core.impl.ResourceGroupManager; import com.azure.spring.identity.DefaultSpringCredentialBuilder; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -17,17 +17,18 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.core.env.Environment; - /** * Auto-config to provide default {@link CredentialsProvider} for all Azure services * * @author Warren Zhu */ @Configuration -@EnableConfigurationProperties(AzureProperties.class) +@EnableConfigurationProperties(AzureContextProperties.class) @ConditionalOnClass(AzureResourceManager.class) @ConditionalOnProperty(prefix = "spring.cloud.azure", value = { "resource-group" }) +@Import(AzureEnvironmentAutoConfiguration.class) public class AzureContextAutoConfiguration { /** @@ -48,16 +49,17 @@ public AzureResourceManager azureResourceManager(TokenCredential credential, Azu @Bean @ConditionalOnMissingBean - public AzureProfile azureProfile(AzureProperties azureProperties) { - return new AzureProfile(azureProperties.getTenantId(), azureProperties.getSubscriptionId(), - azureProperties.getEnvironment().getAzureEnvironment()); + public AzureProfile azureProfile(AzureContextProperties azureContextProperties, + EnvironmentProvider environmentProvider) { + return new AzureProfile(azureContextProperties.getTenantId(), azureContextProperties.getSubscriptionId(), + environmentProvider.getEnvironment()); } @Bean @ConditionalOnMissingBean public TokenCredential credential(Environment environment) { return new DefaultSpringCredentialBuilder().environment(environment) - .alternativePrefix(AzureProperties.PREFIX) + .alternativePrefix(AzureContextProperties.PREFIX) .build(); } @@ -65,11 +67,11 @@ public TokenCredential credential(Environment environment) { @ConditionalOnMissingBean @ConditionalOnBean(AzureResourceManager.class) public ResourceGroupManager resourceGroupManager(AzureResourceManager azureResourceManager, - AzureProperties azureProperties) { - ResourceGroupManager resourceGroupManager = new ResourceGroupManager(azureResourceManager, azureProperties); - if (azureProperties.isAutoCreateResources() - && !resourceGroupManager.exists(azureProperties.getResourceGroup())) { - resourceGroupManager.create(azureProperties.getResourceGroup()); + AzureContextProperties azureContextProperties) { + ResourceGroupManager resourceGroupManager = new ResourceGroupManager(azureResourceManager, azureContextProperties); + if (azureContextProperties.isAutoCreateResources() + && !resourceGroupManager.exists(azureContextProperties.getResourceGroup())) { + resourceGroupManager.create(azureContextProperties.getResourceGroup()); } return resourceGroupManager; } diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/config/AzureProperties.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureContextProperties.java similarity index 91% rename from sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/config/AzureProperties.java rename to sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureContextProperties.java index a55bdfaee6f44..6b9ca36d9f9a1 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/config/AzureProperties.java +++ b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureContextProperties.java @@ -1,10 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.context.core.config; +package com.azure.spring.cloud.autoconfigure.context; - -import com.azure.spring.cloud.context.core.api.CredentialSupplier; import com.azure.spring.cloud.context.core.enums.AzureEnvironments; import com.google.common.base.Strings; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -14,11 +12,11 @@ import javax.annotation.PostConstruct; /** - * Azure related properties. + * Azure Context related properties for resource management. */ @Validated -@ConfigurationProperties(AzureProperties.PREFIX) -public class AzureProperties implements CredentialSupplier { +@ConfigurationProperties(AzureContextProperties.PREFIX) +public class AzureContextProperties { public static final String PREFIX = "spring.cloud.azure"; diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureEnvironmentAutoConfiguration.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureEnvironmentAutoConfiguration.java index 57922173fefd4..4ddab3e9edc9e 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureEnvironmentAutoConfiguration.java +++ b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/autoconfigure/context/AzureEnvironmentAutoConfiguration.java @@ -4,7 +4,6 @@ package com.azure.spring.cloud.autoconfigure.context; import com.azure.spring.cloud.context.core.api.EnvironmentProvider; -import com.azure.spring.cloud.context.core.config.AzureProperties; import com.azure.spring.cloud.context.core.impl.DefaultEnvironmentProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -21,11 +20,11 @@ public class AzureEnvironmentAutoConfiguration { @Bean @ConditionalOnMissingBean - public EnvironmentProvider environmentProvider(@Autowired(required = false) AzureProperties azureProperties) { + public EnvironmentProvider environmentProvider(@Autowired(required = false) AzureContextProperties azureContextProperties) { DefaultEnvironmentProvider defaultEnvironmentProvider = new DefaultEnvironmentProvider(); - if (azureProperties != null) { - defaultEnvironmentProvider.setEnvironment(azureProperties.getEnvironment().getAzureEnvironment()); + if (azureContextProperties != null) { + defaultEnvironmentProvider.setEnvironment(azureContextProperties.getEnvironment().getAzureEnvironment()); } return defaultEnvironmentProvider; diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/api/CredentialSupplier.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/api/CredentialSupplier.java deleted file mode 100644 index 55661622cfc71..0000000000000 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/api/CredentialSupplier.java +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.cloud.context.core.api; - -/** - * An interface meant to be implemented by configuration properties POJOs that store information about Azure - * credentials. - * - * @author Warren Zhu - */ -public interface CredentialSupplier { - - String getClientId(); - - String getClientSecret(); - - boolean isMsiEnabled(); - - String getTenantId(); - - String getSubscriptionId(); -} diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/config/package-info.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/config/package-info.java deleted file mode 100644 index 21e74e7ad78ed..0000000000000 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/config/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -/** - * Package com.azure.spring.cloud.context.core.config; - */ -package com.azure.spring.cloud.context.core.config; diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/AzureManager.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/AzureManager.java index 9a9920fd5e851..82eb9912cccb8 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/AzureManager.java +++ b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/AzureManager.java @@ -4,8 +4,8 @@ package com.azure.spring.cloud.context.core.impl; import com.azure.core.management.exception.ManagementException; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import com.azure.spring.cloud.context.core.api.ResourceManager; -import com.azure.spring.cloud.context.core.config.AzureProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.lang.NonNull; @@ -21,14 +21,14 @@ public abstract class AzureManager implements ResourceManager { private static final Logger LOGGER = LoggerFactory.getLogger(AzureManager.class); - private final AzureProperties azureProperties; + private final AzureContextProperties azureContextProperties; protected final String resourceGroup; protected final String region; - public AzureManager(@NonNull AzureProperties azureProperties) { - this.azureProperties = azureProperties; - this.resourceGroup = azureProperties.getResourceGroup(); - this.region = azureProperties.getRegion(); + public AzureManager(@NonNull AzureContextProperties azureContextProperties) { + this.azureContextProperties = azureContextProperties; + this.resourceGroup = azureContextProperties.getResourceGroup(); + this.region = azureContextProperties.getRegion(); } @Override @@ -90,7 +90,7 @@ public T getOrCreate(K key) { return result; } - if (!azureProperties.isAutoCreateResources()) { + if (!azureContextProperties.isAutoCreateResources()) { String message = String.format("%s with name '%s' not existed.", getResourceType(), getResourceName(key)); LOGGER.warn(message); String enable = "If you want to enable automatic resource creation. Please set spring.cloud.azure" diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/DefaultCredentialsProvider.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/DefaultCredentialsProvider.java deleted file mode 100644 index ff6b86af31ce2..0000000000000 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/DefaultCredentialsProvider.java +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.cloud.context.core.impl; - -import com.azure.core.credential.TokenCredential; -import com.azure.identity.ClientSecretCredentialBuilder; -import com.azure.identity.ManagedIdentityCredentialBuilder; -import com.azure.spring.cloud.context.core.api.CredentialsProvider; -import com.azure.spring.cloud.context.core.config.AzureProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * A {@link CredentialsProvider} implementation that provides credentials based on user-provided properties and - * defaults. - * - * @author Warren Zhu - */ -public class DefaultCredentialsProvider implements CredentialsProvider { - - private static final Logger LOGGER = LoggerFactory.getLogger(DefaultCredentialsProvider.class); - - private final TokenCredential credentials; - - public DefaultCredentialsProvider(AzureProperties azureProperties) { - this.credentials = initCredentials(azureProperties); - } - - private TokenCredential initCredentials(AzureProperties azureProperties) { - final String clientId = azureProperties.getClientId(); - final String clientSecret = azureProperties.getClientSecret(); - final String tenantId = azureProperties.getTenantId(); - - if (clientId != null && clientSecret != null && tenantId != null) { - LOGGER.debug("Will use ClientSecretCredential"); - return new ClientSecretCredentialBuilder() - .clientId(clientId) - .clientSecret(clientSecret) - .tenantId(tenantId) - .authorityHost(azureProperties.getEnvironment().getAzureEnvironment().getActiveDirectoryEndpoint()) - .build(); - } - - if (azureProperties.isMsiEnabled()) { - final String managedIdentityClientId = azureProperties.getClientId(); - - if (managedIdentityClientId != null) { - LOGGER.debug("Will use MSI credentials with specified clientId"); - return new ManagedIdentityCredentialBuilder().clientId(managedIdentityClientId).build(); - } - } - - LOGGER.debug("Will use MSI credentials"); - return new ManagedIdentityCredentialBuilder().build(); - } - - @Override - public TokenCredential getCredential() { - return this.credentials; - } -} diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/DefaultEnvironmentProvider.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/DefaultEnvironmentProvider.java index ec57c47b95d3c..0958d5556f62a 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/DefaultEnvironmentProvider.java +++ b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/DefaultEnvironmentProvider.java @@ -5,11 +5,11 @@ import com.azure.core.management.AzureEnvironment; import com.azure.spring.cloud.context.core.api.EnvironmentProvider; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; /** * A {@link EnvironmentProvider} implementation that based on {@link - * AzureProperties}. + * AzureContextProperties}. * * @author Warren Zhu */ @@ -22,7 +22,24 @@ public AzureEnvironment getEnvironment() { return environment; } + public void setEnvironment(String cloud) { + this.environment = toAzureEnvironment(cloud); + } + public void setEnvironment(AzureEnvironment environment) { this.environment = environment; } + + private AzureEnvironment toAzureEnvironment(String cloud) { + switch (cloud) { + case "AzureChina": + return AzureEnvironment.AZURE_CHINA; + case "AzureGermany": + return AzureEnvironment.AZURE_GERMANY; + case "AzureUSGovernment": + return AzureEnvironment.AZURE_US_GOVERNMENT; + default: + return AzureEnvironment.AZURE; + } + } } diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/EventHubConsumerGroupManager.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/EventHubConsumerGroupManager.java index c0ea127fa9e9d..26c2b00a1269d 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/EventHubConsumerGroupManager.java +++ b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/EventHubConsumerGroupManager.java @@ -6,8 +6,8 @@ import com.azure.resourcemanager.AzureResourceManager; import com.azure.resourcemanager.eventhubs.models.EventHub; import com.azure.resourcemanager.eventhubs.models.EventHubConsumerGroup; -import com.azure.spring.cloud.context.core.config.AzureProperties; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; +import com.azure.spring.core.util.Tuple; /** * Resource manager for Event Hubs consumer group. @@ -15,9 +15,9 @@ public class EventHubConsumerGroupManager extends AzureManager> { private final AzureResourceManager azureResourceManager; - - public EventHubConsumerGroupManager(AzureResourceManager azureResourceManager, AzureProperties azureProperties) { - super(azureProperties); + + public EventHubConsumerGroupManager(AzureResourceManager azureResourceManager, AzureContextProperties azureContextProperties) { + super(azureContextProperties); this.azureResourceManager = azureResourceManager; } diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/EventHubManager.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/EventHubManager.java index ff3bdfbe3d52b..3c7acc0410015 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/EventHubManager.java +++ b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/EventHubManager.java @@ -7,8 +7,8 @@ import com.azure.resourcemanager.AzureResourceManager; import com.azure.resourcemanager.eventhubs.models.EventHub; import com.azure.resourcemanager.eventhubs.models.EventHubNamespace; -import com.azure.spring.cloud.context.core.config.AzureProperties; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; +import com.azure.spring.core.util.Tuple; /** * Resource manager for Event Hubs. @@ -17,8 +17,8 @@ public class EventHubManager extends AzureManager { private final AzureResourceManager azureResourceManager; - public RedisCacheManager(AzureResourceManager azureResourceManager, AzureProperties azureProperties) { - super(azureProperties); + public RedisCacheManager(AzureResourceManager azureResourceManager, AzureContextProperties azureContextProperties) { + super(azureContextProperties); this.azureResourceManager = azureResourceManager; } diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ResourceGroupManager.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ResourceGroupManager.java index 60ffcdf9bc990..58b347e742406 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ResourceGroupManager.java +++ b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ResourceGroupManager.java @@ -6,7 +6,7 @@ import com.azure.core.management.exception.ManagementException; import com.azure.resourcemanager.AzureResourceManager; import com.azure.resourcemanager.resources.models.ResourceGroup; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; /** * Resource manager for resource group. @@ -15,8 +15,8 @@ public class ResourceGroupManager extends AzureManager { private final AzureResourceManager azureResourceManager; - public ResourceGroupManager(AzureResourceManager azureResourceManager, AzureProperties azureProperties) { - super(azureProperties); + public ResourceGroupManager(AzureResourceManager azureResourceManager, AzureContextProperties azureContextProperties) { + super(azureContextProperties); this.azureResourceManager = azureResourceManager; } diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ServiceBusNamespaceManager.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ServiceBusNamespaceManager.java index 20975479fd148..3d97d432c8ca1 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ServiceBusNamespaceManager.java +++ b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ServiceBusNamespaceManager.java @@ -6,7 +6,7 @@ import com.azure.core.management.exception.ManagementException; import com.azure.resourcemanager.AzureResourceManager; import com.azure.resourcemanager.servicebus.models.ServiceBusNamespace; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; /** * Resource manager for Service Bus namespace. @@ -15,8 +15,8 @@ public class ServiceBusNamespaceManager extends AzureManager> { - public ServiceBusQueueManager(AzureProperties azureProperties) { - super(azureProperties); + public ServiceBusQueueManager(AzureContextProperties azureContextProperties) { + super(azureContextProperties); } @Override diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ServiceBusTopicManager.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ServiceBusTopicManager.java index 0c21a4a7a80d7..4ed187cae4649 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ServiceBusTopicManager.java +++ b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ServiceBusTopicManager.java @@ -6,16 +6,16 @@ import com.azure.core.management.exception.ManagementException; import com.azure.resourcemanager.servicebus.models.ServiceBusNamespace; import com.azure.resourcemanager.servicebus.models.Topic; -import com.azure.spring.cloud.context.core.config.AzureProperties; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; +import com.azure.spring.core.util.Tuple; /** * Resource manager for Service Bus topic. */ public class ServiceBusTopicManager extends AzureManager> { - public ServiceBusTopicManager(AzureProperties azureProperties) { - super(azureProperties); + public ServiceBusTopicManager(AzureContextProperties azureContextProperties) { + super(azureContextProperties); } @Override diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ServiceBusTopicSubscriptionManager.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ServiceBusTopicSubscriptionManager.java index e8872ca4b726c..b0cfe15bf5cf0 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ServiceBusTopicSubscriptionManager.java +++ b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/ServiceBusTopicSubscriptionManager.java @@ -6,8 +6,8 @@ import com.azure.core.management.exception.ManagementException; import com.azure.resourcemanager.servicebus.models.ServiceBusSubscription; import com.azure.resourcemanager.servicebus.models.Topic; -import com.azure.spring.cloud.context.core.config.AzureProperties; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; +import com.azure.spring.core.util.Tuple; /** * Resource manager for Service Bus topic subscription. @@ -15,8 +15,8 @@ public class ServiceBusTopicSubscriptionManager extends AzureManager> { - public ServiceBusTopicSubscriptionManager(AzureProperties azureProperties) { - super(azureProperties); + public ServiceBusTopicSubscriptionManager(AzureContextProperties azureContextProperties) { + super(azureContextProperties); } @Override diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/StorageAccountManager.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/StorageAccountManager.java index 6156402f00b40..5b622e198eea7 100644 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/StorageAccountManager.java +++ b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/impl/StorageAccountManager.java @@ -6,7 +6,7 @@ import com.azure.core.management.exception.ManagementException; import com.azure.resourcemanager.AzureResourceManager; import com.azure.resourcemanager.storage.models.StorageAccount; -import com.azure.spring.cloud.context.core.config.AzureProperties; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import javax.annotation.Nonnull; @@ -17,8 +17,8 @@ public class StorageAccountManager extends AzureManager private final AzureResourceManager azureResourceManager; - public StorageAccountManager(@Nonnull AzureResourceManager azureResourceManager, AzureProperties azureProperties) { - super(azureProperties); + public StorageAccountManager(@Nonnull AzureResourceManager azureResourceManager, AzureContextProperties azureContextProperties) { + super(azureContextProperties); this.azureResourceManager = azureResourceManager; } diff --git a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/Constants.java b/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/Constants.java deleted file mode 100644 index f09987a72a226..0000000000000 --- a/sdk/spring/azure-spring-cloud-context/src/main/java/com/azure/spring/cloud/context/core/util/Constants.java +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -package com.azure.spring.cloud.context.core.util; - -/** - * The User Agent constants. - */ -public class Constants { - - // for the User-Agent header set in track2 SDKs - private static final String SNAPSHOT_VERSION = "snapshot"; - private static final String AZURE = "az"; - private static final String SPRING_CLOUD = "sc"; - private static final String SPRING_STREAMS = "ss"; - private static final String SPRING_INTEGRATION = "si"; - private static final String KEY_VAULT = "kv"; - private static final String STORAGE_BLOBS = "sb"; - private static final String STORAGE_FILE_SHARE = "sf"; - private static final String STORAGE_QUEUE = "sq"; - private static final String EVENT_HUB = "eh"; - private static final String SERVICE_BUS = "bus"; - private static final String APP_CONFIGURATION = "cfg"; - - - public static final String SPRING_CLOUD_VERSION = SNAPSHOT_VERSION; - - // the max length of application id is 24 - public static final String SPRING_INTEGRATION_STORAGE_QUEUE_APPLICATION_ID = - String.join("-", AZURE, SPRING_INTEGRATION, STORAGE_QUEUE) + "/" + SPRING_CLOUD_VERSION; - - public static final String SPRING_EVENT_HUB_APPLICATION_ID = - String.join("-", AZURE, SPRING_CLOUD, EVENT_HUB) + "/" + SPRING_CLOUD_VERSION; -} diff --git a/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureContextAutoConfigurationTest.java b/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureContextAutoConfigurationTest.java index 38659a3279756..576c2224ded4b 100644 --- a/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureContextAutoConfigurationTest.java +++ b/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureContextAutoConfigurationTest.java @@ -3,11 +3,9 @@ package com.azure.spring.cloud.autoconfigure.context; -import com.azure.core.management.AzureEnvironment; import com.azure.core.management.profile.AzureProfile; import com.azure.resourcemanager.AzureResourceManager; import com.azure.spring.cloud.context.core.api.CredentialsProvider; -import com.azure.spring.cloud.context.core.config.AzureProperties; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.FilteredClassLoader; @@ -16,8 +14,8 @@ import org.springframework.context.annotation.Configuration; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mock; public class AzureContextAutoConfigurationTest { @@ -28,13 +26,13 @@ public class AzureContextAutoConfigurationTest { @Test public void testAzureDisabled() { - this.contextRunner.run(context -> assertThat(context).doesNotHaveBean(AzureProperties.class)); + this.contextRunner.run(context -> assertThat(context).doesNotHaveBean(AzureContextProperties.class)); } @Test public void testWithoutAzureClass() { this.contextRunner.withClassLoader(new FilteredClassLoader(AzureResourceManager.class)) - .run(context -> assertThat(context).doesNotHaveBean(AzureProperties.class)); + .run(context -> assertThat(context).doesNotHaveBean(AzureContextProperties.class)); } @Test @@ -42,7 +40,7 @@ public void testLocationRequiredWhenAutoCreateResources() { this.contextRunner.withPropertyValues(AZURE_PROPERTY_PREFIX + "resourceGroup=group1") .withPropertyValues(AZURE_PROPERTY_PREFIX + "auto-create-resources=true") .run(context -> assertThrows(IllegalStateException.class, - () -> context.getBean(AzureProperties.class))); + () -> context.getBean(AzureContextProperties.class))); } @Test @@ -56,15 +54,13 @@ public void testAzurePropertiesConfigured() { AZURE_PROPERTY_PREFIX + "region=region1", AZURE_PROPERTY_PREFIX + "subscriptionId=sub1") .run(context -> { - assertThat(context).hasSingleBean(AzureProperties.class); - assertThat(context.getBean(AzureProperties.class).getClientId()).isEqualTo("client1"); - assertThat(context.getBean(AzureProperties.class).getClientSecret()).isEqualTo("secret1"); - assertThat(context.getBean(AzureProperties.class).getTenantId()).isEqualTo("tenant1"); - assertThat(context.getBean(AzureProperties.class).getResourceGroup()).isEqualTo("rg1"); - assertThat(context.getBean(AzureProperties.class).getRegion()).isEqualTo("region1"); - assertThat(context.getBean(AzureProperties.class).getSubscriptionId()).isEqualTo("sub1"); - assertThat(context.getBean(AzureProperties.class).getEnvironment().getAzureEnvironment()) - .isEqualTo(AzureEnvironment.AZURE); + assertThat(context).hasSingleBean(AzureContextProperties.class); + assertThat(context.getBean(AzureContextProperties.class).getClientId()).isEqualTo("client1"); + assertThat(context.getBean(AzureContextProperties.class).getClientSecret()).isEqualTo("secret1"); + assertThat(context.getBean(AzureContextProperties.class).getTenantId()).isEqualTo("tenant1"); + assertThat(context.getBean(AzureContextProperties.class).getResourceGroup()).isEqualTo("rg1"); + assertThat(context.getBean(AzureContextProperties.class).getRegion()).isEqualTo("region1"); + assertThat(context.getBean(AzureContextProperties.class).getSubscriptionId()).isEqualTo("sub1"); }); } @@ -73,7 +69,7 @@ public void testAutoConfigureEnabled() { this.contextRunner.withPropertyValues(AZURE_PROPERTY_PREFIX + "resource-group=rg1") .withUserConfiguration(TestConfigurationWithResourceManager.class) .run(context -> { - assertThat(context).hasSingleBean(AzureProperties.class); + assertThat(context).hasSingleBean(AzureContextProperties.class); assertThat(context).hasSingleBean(AzureProfile.class); }); } diff --git a/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureEnvironmentConfigurationTest.java b/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureEnvironmentConfigurationTest.java index f0683dadfed6f..4b205824b2a04 100644 --- a/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureEnvironmentConfigurationTest.java +++ b/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/autoconfigure/context/AzureEnvironmentConfigurationTest.java @@ -3,13 +3,10 @@ package com.azure.spring.cloud.autoconfigure.context; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; import com.azure.core.management.AzureEnvironment; import com.azure.resourcemanager.AzureResourceManager; import com.azure.spring.cloud.context.core.api.CredentialsProvider; import com.azure.spring.cloud.context.core.api.EnvironmentProvider; -import com.azure.spring.cloud.context.core.config.AzureProperties; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -17,6 +14,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + public class AzureEnvironmentConfigurationTest { private static final String AZURE_PROPERTY_PREFIX = "spring.cloud.azure."; @@ -46,7 +46,7 @@ public void testWithAnotherEnvironment() { @Configuration - @EnableConfigurationProperties(AzureProperties.class) + @EnableConfigurationProperties(AzureContextProperties.class) static class TestConfigurationWithProperty { } diff --git a/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/context/core/ApplicationIdTest.java b/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/context/core/ApplicationIdTest.java index 7765b741eb2f0..33fce79d1510f 100644 --- a/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/context/core/ApplicationIdTest.java +++ b/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/context/core/ApplicationIdTest.java @@ -5,14 +5,15 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import static com.azure.spring.cloud.context.core.util.Constants.SPRING_INTEGRATION_STORAGE_QUEUE_APPLICATION_ID; +import static com.azure.spring.core.ApplicationId.AZURE_SPRING_STORAGE_QUEUE; +import static com.azure.spring.core.ApplicationId.VERSION; public class ApplicationIdTest { @Test public void maxLength() { - Assertions.assertTrue(SPRING_INTEGRATION_STORAGE_QUEUE_APPLICATION_ID.length() <= 24); + Assertions.assertTrue((AZURE_SPRING_STORAGE_QUEUE + VERSION).length() <= 24); } } diff --git a/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/context/core/MemoizerTest.java b/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/context/core/MemoizerTest.java index 2ada36b0cc16a..533106a7664d2 100644 --- a/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/context/core/MemoizerTest.java +++ b/sdk/spring/azure-spring-cloud-context/src/test/java/com/azure/spring/cloud/context/core/MemoizerTest.java @@ -5,8 +5,8 @@ import static org.mockito.Mockito.*; -import com.azure.spring.cloud.context.core.util.Memoizer; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.core.util.Memoizer; +import com.azure.spring.core.util.Tuple; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; diff --git a/sdk/spring/azure-spring-cloud-storage/src/main/java/com/azure/spring/cloud/autoconfigure/storage/AzureStorageProperties.java b/sdk/spring/azure-spring-cloud-storage/src/main/java/com/azure/spring/cloud/autoconfigure/storage/AzureStorageProperties.java index 1bfa8d45a01ad..c049a94ff5cb8 100644 --- a/sdk/spring/azure-spring-cloud-storage/src/main/java/com/azure/spring/cloud/autoconfigure/storage/AzureStorageProperties.java +++ b/sdk/spring/azure-spring-cloud-storage/src/main/java/com/azure/spring/cloud/autoconfigure/storage/AzureStorageProperties.java @@ -22,7 +22,7 @@ public class AzureStorageProperties { private String account; private String accessKey; - + private String resourceGroup; public String getAccount() { @@ -44,7 +44,7 @@ public void setAccessKey(String accessKey) { public String getResourceGroup() { return resourceGroup; } - + public void setResourceGroup(String resourceGroup) { this.resourceGroup = resourceGroup; } diff --git a/sdk/spring/azure-spring-cloud-stream-binder-eventhubs/src/main/java/com/azure/spring/eventhub/stream/binder/config/EventHubBinderConfiguration.java b/sdk/spring/azure-spring-cloud-stream-binder-eventhubs/src/main/java/com/azure/spring/eventhub/stream/binder/config/EventHubBinderConfiguration.java index afa52d04fa2ab..3687afeffe39d 100644 --- a/sdk/spring/azure-spring-cloud-stream-binder-eventhubs/src/main/java/com/azure/spring/eventhub/stream/binder/config/EventHubBinderConfiguration.java +++ b/sdk/spring/azure-spring-cloud-stream-binder-eventhubs/src/main/java/com/azure/spring/eventhub/stream/binder/config/EventHubBinderConfiguration.java @@ -5,11 +5,11 @@ import com.azure.resourcemanager.AzureResourceManager; import com.azure.spring.cloud.autoconfigure.context.AzureContextAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.context.AzureContextProperties; import com.azure.spring.cloud.autoconfigure.context.AzureEnvironmentAutoConfiguration; import com.azure.spring.cloud.autoconfigure.eventhub.AzureEventHubAutoConfiguration; import com.azure.spring.cloud.autoconfigure.eventhub.AzureEventHubProperties; import com.azure.spring.cloud.autoconfigure.eventhub.EventHubUtils; -import com.azure.spring.cloud.context.core.config.AzureProperties; import com.azure.spring.cloud.context.core.impl.EventHubConsumerGroupManager; import com.azure.spring.cloud.context.core.impl.EventHubManager; import com.azure.spring.cloud.context.core.impl.EventHubNamespaceManager; @@ -45,16 +45,16 @@ public class EventHubBinderConfiguration { @Bean @ConditionalOnMissingBean @ConditionalOnBean(EventHubNamespaceManager.class) - public EventHubManager eventHubManager(AzureResourceManager azureResourceManager, AzureProperties azureProperties) { - return new EventHubManager(azureResourceManager, azureProperties); + public EventHubManager eventHubManager(AzureResourceManager azureResourceManager, AzureContextProperties azureContextProperties) { + return new EventHubManager(azureResourceManager, azureContextProperties); } @Bean @ConditionalOnMissingBean @ConditionalOnBean(EventHubNamespaceManager.class) public EventHubConsumerGroupManager eventHubConsumerGroupManager(AzureResourceManager azureResourceManager, - AzureProperties azureProperties) { - return new EventHubConsumerGroupManager(azureResourceManager, azureProperties); + AzureContextProperties azureContextProperties) { + return new EventHubConsumerGroupManager(azureResourceManager, azureContextProperties); } @Bean diff --git a/sdk/spring/azure-spring-cloud-stream-binder-eventhubs/src/main/java/com/azure/spring/eventhub/stream/binder/provisioning/EventHubChannelResourceManagerProvisioner.java b/sdk/spring/azure-spring-cloud-stream-binder-eventhubs/src/main/java/com/azure/spring/eventhub/stream/binder/provisioning/EventHubChannelResourceManagerProvisioner.java index 7fee8356d4a78..41c63a65e074a 100644 --- a/sdk/spring/azure-spring-cloud-stream-binder-eventhubs/src/main/java/com/azure/spring/eventhub/stream/binder/provisioning/EventHubChannelResourceManagerProvisioner.java +++ b/sdk/spring/azure-spring-cloud-stream-binder-eventhubs/src/main/java/com/azure/spring/eventhub/stream/binder/provisioning/EventHubChannelResourceManagerProvisioner.java @@ -8,7 +8,7 @@ import com.azure.spring.cloud.context.core.impl.EventHubConsumerGroupManager; import com.azure.spring.cloud.context.core.impl.EventHubManager; import com.azure.spring.cloud.context.core.impl.EventHubNamespaceManager; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.core.util.Tuple; import org.springframework.cloud.stream.provisioning.ProvisioningException; import org.springframework.lang.NonNull; import org.springframework.util.Assert; diff --git a/sdk/spring/azure-spring-cloud-stream-binder-servicebus-queue/src/main/java/com/azure/spring/servicebus/stream/binder/provisioning/ServiceBusQueueChannelResourceManagerProvisioner.java b/sdk/spring/azure-spring-cloud-stream-binder-servicebus-queue/src/main/java/com/azure/spring/servicebus/stream/binder/provisioning/ServiceBusQueueChannelResourceManagerProvisioner.java index 66896af6d3561..1f7fd898bef79 100644 --- a/sdk/spring/azure-spring-cloud-stream-binder-servicebus-queue/src/main/java/com/azure/spring/servicebus/stream/binder/provisioning/ServiceBusQueueChannelResourceManagerProvisioner.java +++ b/sdk/spring/azure-spring-cloud-stream-binder-servicebus-queue/src/main/java/com/azure/spring/servicebus/stream/binder/provisioning/ServiceBusQueueChannelResourceManagerProvisioner.java @@ -7,7 +7,7 @@ import com.azure.resourcemanager.servicebus.models.ServiceBusNamespace; import com.azure.spring.cloud.context.core.impl.ServiceBusNamespaceManager; import com.azure.spring.cloud.context.core.impl.ServiceBusQueueManager; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.core.util.Tuple; import org.springframework.cloud.stream.provisioning.ProvisioningException; import org.springframework.lang.NonNull; import org.springframework.util.Assert; diff --git a/sdk/spring/azure-spring-cloud-stream-binder-servicebus-topic/src/main/java/com/azure/spring/servicebus/stream/binder/provisioning/ServiceBusTopicChannelResourceManagerProvisioner.java b/sdk/spring/azure-spring-cloud-stream-binder-servicebus-topic/src/main/java/com/azure/spring/servicebus/stream/binder/provisioning/ServiceBusTopicChannelResourceManagerProvisioner.java index 26d8cca260759..cbd8a300e22e6 100644 --- a/sdk/spring/azure-spring-cloud-stream-binder-servicebus-topic/src/main/java/com/azure/spring/servicebus/stream/binder/provisioning/ServiceBusTopicChannelResourceManagerProvisioner.java +++ b/sdk/spring/azure-spring-cloud-stream-binder-servicebus-topic/src/main/java/com/azure/spring/servicebus/stream/binder/provisioning/ServiceBusTopicChannelResourceManagerProvisioner.java @@ -8,7 +8,7 @@ import com.azure.spring.cloud.context.core.impl.ServiceBusNamespaceManager; import com.azure.spring.cloud.context.core.impl.ServiceBusTopicManager; import com.azure.spring.cloud.context.core.impl.ServiceBusTopicSubscriptionManager; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.core.util.Tuple; import org.springframework.cloud.stream.provisioning.ProvisioningException; import org.springframework.lang.NonNull; import org.springframework.util.Assert; diff --git a/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/factory/DefaultEventHubClientFactory.java b/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/factory/DefaultEventHubClientFactory.java index 6787551838267..f675fb7b35979 100644 --- a/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/factory/DefaultEventHubClientFactory.java +++ b/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/factory/DefaultEventHubClientFactory.java @@ -11,8 +11,8 @@ import com.azure.messaging.eventhubs.EventProcessorClient; import com.azure.messaging.eventhubs.EventProcessorClientBuilder; import com.azure.messaging.eventhubs.checkpointstore.blob.BlobCheckpointStore; -import com.azure.spring.cloud.context.core.util.Memoizer; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.core.util.Memoizer; +import com.azure.spring.core.util.Tuple; import com.azure.spring.integration.eventhub.api.EventHubClientFactory; import com.azure.spring.integration.eventhub.impl.EventHubProcessor; import com.azure.storage.blob.BlobContainerAsyncClient; @@ -31,7 +31,8 @@ import java.util.function.Consumer; import java.util.function.Function; -import static com.azure.spring.cloud.context.core.util.Constants.SPRING_EVENT_HUB_APPLICATION_ID; +import static com.azure.spring.core.ApplicationId.AZURE_SPRING_EVENT_HUB; +import static com.azure.spring.core.ApplicationId.VERSION; /** * Default implementation of {@link EventHubClientFactory}. @@ -72,14 +73,14 @@ private EventHubConsumerAsyncClient createEventHubClient(String eventHubName, St return new EventHubClientBuilder() .connectionString(eventHubConnectionString, eventHubName) .consumerGroup(consumerGroup) - .clientOptions(new ClientOptions().setApplicationId(SPRING_EVENT_HUB_APPLICATION_ID)) + .clientOptions(new ClientOptions().setApplicationId(AZURE_SPRING_EVENT_HUB + VERSION)) .buildAsyncConsumerClient(); } private EventHubProducerAsyncClient createProducerClient(String eventHubName) { return new EventHubClientBuilder() .connectionString(eventHubConnectionString, eventHubName) - .clientOptions(new ClientOptions().setApplicationId(SPRING_EVENT_HUB_APPLICATION_ID)) + .clientOptions(new ClientOptions().setApplicationId(AZURE_SPRING_EVENT_HUB + VERSION)) .buildAsyncProducerClient(); } @@ -93,7 +94,7 @@ private EventProcessorClient createEventProcessorClientInternal(String eventHubN BlobContainerAsyncClient blobClient = new BlobContainerClientBuilder() .connectionString(checkpointStorageConnectionString) .containerName(containerName) - .httpLogOptions(new HttpLogOptions().setApplicationId(SPRING_EVENT_HUB_APPLICATION_ID)) + .httpLogOptions(new HttpLogOptions().setApplicationId(AZURE_SPRING_EVENT_HUB + VERSION)) .buildAsyncClient(); final Boolean isContainerExist = blobClient.exists().block(); diff --git a/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/impl/EventHubRxTemplate.java b/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/impl/EventHubRxTemplate.java index 0e1b24e60e200..4aa10c4050849 100644 --- a/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/impl/EventHubRxTemplate.java +++ b/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/impl/EventHubRxTemplate.java @@ -3,7 +3,7 @@ package com.azure.spring.integration.eventhub.impl; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.core.util.Tuple; import com.azure.spring.integration.core.api.PartitionSupplier; import com.azure.spring.integration.eventhub.api.EventHubClientFactory; import com.azure.spring.integration.eventhub.api.EventHubRxOperation; diff --git a/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/impl/EventHubTemplate.java b/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/impl/EventHubTemplate.java index cab77e09699a8..40d67bd1ffeff 100644 --- a/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/impl/EventHubTemplate.java +++ b/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/impl/EventHubTemplate.java @@ -3,7 +3,7 @@ package com.azure.spring.integration.eventhub.impl; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.core.util.Tuple; import com.azure.spring.integration.eventhub.api.EventHubClientFactory; import com.azure.spring.integration.eventhub.api.EventHubOperation; import org.slf4j.Logger; diff --git a/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/support/RxEventHubTestOperation.java b/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/support/RxEventHubTestOperation.java index ad52b686622e3..8be28600b7121 100644 --- a/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/support/RxEventHubTestOperation.java +++ b/sdk/spring/azure-spring-integration-eventhubs/src/main/java/com/azure/spring/integration/eventhub/support/RxEventHubTestOperation.java @@ -4,7 +4,7 @@ package com.azure.spring.integration.eventhub.support; import com.azure.messaging.eventhubs.models.EventContext; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.core.util.Tuple; import com.azure.spring.integration.core.api.PartitionSupplier; import com.azure.spring.integration.eventhub.api.EventHubClientFactory; import com.azure.spring.integration.eventhub.api.EventHubRxOperation; diff --git a/sdk/spring/azure-spring-integration-servicebus/src/main/java/com/azure/spring/integration/servicebus/factory/DefaultServiceBusTopicClientFactory.java b/sdk/spring/azure-spring-integration-servicebus/src/main/java/com/azure/spring/integration/servicebus/factory/DefaultServiceBusTopicClientFactory.java index 6a4064eebe565..3fa3d862dd949 100644 --- a/sdk/spring/azure-spring-integration-servicebus/src/main/java/com/azure/spring/integration/servicebus/factory/DefaultServiceBusTopicClientFactory.java +++ b/sdk/spring/azure-spring-integration-servicebus/src/main/java/com/azure/spring/integration/servicebus/factory/DefaultServiceBusTopicClientFactory.java @@ -10,7 +10,7 @@ import com.azure.messaging.servicebus.ServiceBusReceivedMessageContext; import com.azure.messaging.servicebus.ServiceBusSenderAsyncClient; import com.azure.messaging.servicebus.models.ServiceBusReceiveMode; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.core.util.Tuple; import com.azure.spring.integration.servicebus.ServiceBusClientConfig; import com.azure.spring.integration.servicebus.ServiceBusMessageProcessor; diff --git a/sdk/spring/azure-spring-integration-servicebus/src/main/java/com/azure/spring/integration/servicebus/topic/ServiceBusTopicTemplate.java b/sdk/spring/azure-spring-integration-servicebus/src/main/java/com/azure/spring/integration/servicebus/topic/ServiceBusTopicTemplate.java index dffb1dc6f9113..b4ce22f819d3a 100644 --- a/sdk/spring/azure-spring-integration-servicebus/src/main/java/com/azure/spring/integration/servicebus/topic/ServiceBusTopicTemplate.java +++ b/sdk/spring/azure-spring-integration-servicebus/src/main/java/com/azure/spring/integration/servicebus/topic/ServiceBusTopicTemplate.java @@ -4,7 +4,7 @@ package com.azure.spring.integration.servicebus.topic; import com.azure.messaging.servicebus.ServiceBusProcessorClient; -import com.azure.spring.cloud.context.core.util.Tuple; +import com.azure.spring.core.util.Tuple; import com.azure.spring.integration.servicebus.DefaultServiceBusMessageProcessor; import com.azure.spring.integration.servicebus.ServiceBusClientConfig; import com.azure.spring.integration.servicebus.ServiceBusRuntimeException; diff --git a/sdk/spring/azure-spring-integration-storage-queue/src/main/java/com/azure/spring/integration/storage/queue/factory/DefaultStorageQueueClientFactory.java b/sdk/spring/azure-spring-integration-storage-queue/src/main/java/com/azure/spring/integration/storage/queue/factory/DefaultStorageQueueClientFactory.java index 0e89afbc6a1ae..f2e462c76642e 100644 --- a/sdk/spring/azure-spring-integration-storage-queue/src/main/java/com/azure/spring/integration/storage/queue/factory/DefaultStorageQueueClientFactory.java +++ b/sdk/spring/azure-spring-integration-storage-queue/src/main/java/com/azure/spring/integration/storage/queue/factory/DefaultStorageQueueClientFactory.java @@ -3,8 +3,9 @@ package com.azure.spring.integration.storage.queue.factory; +import com.azure.core.http.policy.HttpLogDetailLevel; import com.azure.core.http.policy.HttpLogOptions; -import com.azure.spring.cloud.context.core.util.Memoizer; +import com.azure.spring.core.util.Memoizer; import com.azure.storage.queue.QueueAsyncClient; import com.azure.storage.queue.QueueClientBuilder; import org.slf4j.Logger; @@ -13,7 +14,8 @@ import java.util.function.Function; -import static com.azure.spring.cloud.context.core.util.Constants.SPRING_INTEGRATION_STORAGE_QUEUE_APPLICATION_ID; +import static com.azure.spring.core.ApplicationId.VERSION; +import static com.azure.spring.core.ApplicationId.AZURE_SPRING_STORAGE_QUEUE; /** * Default client factory for Storage Queue. @@ -22,9 +24,15 @@ public class DefaultStorageQueueClientFactory implements StorageQueueClientFacto private static final Logger LOGGER = LoggerFactory.getLogger(DefaultStorageQueueClientFactory.class); private final String connectionString; private final Function queueClientCreator = Memoizer.memoize(this::createQueueClient); + private final HttpLogDetailLevel httpLogDetailLevel; public DefaultStorageQueueClientFactory(@NonNull String connectionString) { + this(connectionString, HttpLogDetailLevel.NONE); + } + + public DefaultStorageQueueClientFactory(@NonNull String connectionString, HttpLogDetailLevel httpLogDetailLevel) { this.connectionString = connectionString; + this.httpLogDetailLevel = httpLogDetailLevel; } @Override @@ -36,7 +44,9 @@ private QueueAsyncClient createQueueClient(String queueName) { final QueueAsyncClient queueClient = new QueueClientBuilder() .connectionString(this.connectionString) .queueName(queueName) - .httpLogOptions(new HttpLogOptions().setApplicationId(SPRING_INTEGRATION_STORAGE_QUEUE_APPLICATION_ID)) + .httpLogOptions(new HttpLogOptions() + .setApplicationId(AZURE_SPRING_STORAGE_QUEUE + VERSION) + .setLogLevel(httpLogDetailLevel)) .buildAsyncClient(); // TODO (xiada): when used with connection string, this call will throw exception diff --git a/sdk/spring/ci.yml b/sdk/spring/ci.yml index f46c3deda3721..8281144810333 100644 --- a/sdk/spring/ci.yml +++ b/sdk/spring/ci.yml @@ -27,9 +27,9 @@ extends: parameters: ServiceDirectory: spring Artifacts: - - name: azure-identity-spring + - name: azure-spring-boot-core groupId: com.azure.spring - safeName: azureidentityspring + safeName: azurespringbootcore - name: azure-spring-boot groupId: com.azure.spring safeName: azurespringboot diff --git a/sdk/spring/pom.xml b/sdk/spring/pom.xml index d8a81dce8c03f..ca516bfacf8dd 100644 --- a/sdk/spring/pom.xml +++ b/sdk/spring/pom.xml @@ -13,7 +13,7 @@ coverage - azure-identity-spring + azure-spring-boot-core azure-spring-boot azure-spring-cloud-autoconfigure azure-spring-cloud-context @@ -31,8 +31,8 @@ com.azure.spring - azure-identity-spring - 1.7.0-beta.1 + azure-spring-boot-core + 1.0.0-beta.1 com.azure.spring @@ -129,7 +129,7 @@ true - azure-identity-spring + azure-spring-boot-core azure-spring-boot azure-spring-boot-starter azure-spring-boot-starter-active-directory diff --git a/sdk/spring/spring-test-template.yml b/sdk/spring/spring-test-template.yml index 2a2889a226e12..d751bb505931c 100644 --- a/sdk/spring/spring-test-template.yml +++ b/sdk/spring/spring-test-template.yml @@ -10,8 +10,6 @@ parameters: - spring/azure-spring-boot-test-storage - spring/azure-spring-cloud-test-eventhubs - spring/azure-spring-cloud-test-servicebus-binder - - spring/azure-spring-boot-samples/azure-spring-cloud-sample-eventhubs-binder - - spring/azure-spring-boot-samples/azure-spring-cloud-sample-eventhubs-kafka Artifacts: - name: azure-spring-boot-test-application groupId: com.azure.spring @@ -58,12 +56,6 @@ parameters: - name: azure-spring-boot-test-storage groupId: com.azure.spring safeName: azurespringbootteststorage - - name: azure-spring-cloud-sample-eventhubs-binder - groupId: com.azure.spring - safeName: azurespringcloudsampleeventhubsbinder - - name: azure-spring-cloud-sample-eventhubs-kafka - groupId: com.azure.spring - safeName: azurespringcloudsampleeventhubskafka - name: azure-spring-cloud-test-servicebus-binder groupId: com.azure.spring safeName: azurespringcloudtestservicebusbinder