From d84b3bce8b0a37fdb1430384e4cd188d22182a49 Mon Sep 17 00:00:00 2001 From: xccc-msft Date: Tue, 19 May 2020 16:52:38 +0800 Subject: [PATCH 1/5] mgmt update default subscription logic --- .../main/java/com/azure/management/Azure.java | 57 +++++++++++++------ .../implementation/ResourceManager.java | 29 +++++++++- 2 files changed, 66 insertions(+), 20 deletions(-) diff --git a/sdk/management/azure/src/main/java/com/azure/management/Azure.java b/sdk/management/azure/src/main/java/com/azure/management/Azure.java index 206f70ac26c1..4780f9d18873 100644 --- a/sdk/management/azure/src/main/java/com/azure/management/Azure.java +++ b/sdk/management/azure/src/main/java/com/azure/management/Azure.java @@ -73,6 +73,8 @@ import com.azure.management.network.implementation.NetworkManager; import com.azure.management.resources.Deployments; import com.azure.management.resources.GenericResources; +import com.azure.management.resources.PolicyAssignments; +import com.azure.management.resources.PolicyDefinitions; import com.azure.management.resources.Providers; import com.azure.management.resources.ResourceGroups; import com.azure.management.resources.Subscription; @@ -94,6 +96,9 @@ import com.azure.management.storage.Usages; import com.azure.management.storage.implementation.StorageManager; +import java.util.ArrayList; +import java.util.List; + /** The entry point for accessing resource management APIs in Azure. */ public final class Azure { private final ResourceManager resourceManager; @@ -229,9 +234,10 @@ public interface Authenticated extends AccessManagement { * Selects the default subscription as the subscription for the APIs to work with. * *

The default subscription can be specified inside the Azure profile using {@link - * AzureProfile}. If no default subscription has been previously provided, the first subscription as - * returned by {@link Authenticated#subscriptions()} will be selected.

+ * AzureProfile}. If no default subscription provided, we will try to set the only + * subscription if applicable returned by {@link Authenticated#subscriptions()}

* + * @throws RuntimeException more than one subscription found in the tenant. * @return an authenticated Azure client configured to work with the default subscription */ Azure withDefaultSubscription(); @@ -325,8 +331,25 @@ public Azure withSubscription(String subscriptionId) { @Override public Azure withDefaultSubscription() { if (profile.subscriptionId() == null) { - throw logger.logExceptionAsError( - new IllegalArgumentException("Please specify the subscription ID for resource management.")); + List subscriptions = new ArrayList<>(); + this.subscriptions().list().forEach(subscription -> { + subscriptions.add(subscription); + }); + if (subscriptions.size() == 0) { + throw logger.logExceptionAsError( + new RuntimeException("Please create a subscription before you start resource management. " + + "To learn more, see: https://azure.microsoft.com/en-us/free/.")); + } else if (subscriptions.size() > 1) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("More than one subscription found in your tenant. " + + "Please specify which one below is desired for resource management."); + subscriptions.forEach(subscription -> { + stringBuilder.append("\n" + subscription.displayName() + " : " + subscription.subscriptionId()); + }); + throw logger.logExceptionAsError(new RuntimeException(stringBuilder.toString())); + } else { + profile.withSubscriptionId(subscriptions.get(0).subscriptionId()); + } } return new Azure(httpPipeline, profile, this); } @@ -416,19 +439,19 @@ public Providers providers() { return resourceManager.providers(); } - // /** - // * @return entry point to managing policy definitions. - // */ - // public PolicyDefinitions policyDefinitions() { - // return resourceManager.policyDefinitions(); - // } - // - // /** - // * @return entry point to managing policy assignments. - // */ - // public PolicyAssignments policyAssignments() { - // return resourceManager.policyAssignments(); - // } + /** + * @return entry point to managing policy definitions. + */ + public PolicyDefinitions policyDefinitions() { + return resourceManager.policyDefinitions(); + } + + /** + * @return entry point to managing policy assignments. + */ + public PolicyAssignments policyAssignments() { + return resourceManager.policyAssignments(); + } /** @return entry point to managing storage accounts */ public StorageAccounts storageAccounts() { diff --git a/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java b/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java index 5db24712e81b..64c5e54fc9c1 100644 --- a/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java +++ b/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java @@ -13,6 +13,7 @@ import com.azure.management.resources.PolicyDefinitions; import com.azure.management.resources.Providers; import com.azure.management.resources.ResourceGroups; +import com.azure.management.resources.Subscription; import com.azure.management.resources.Subscriptions; import com.azure.management.resources.Tenants; import com.azure.management.resources.fluentcore.arm.AzureConfigurable; @@ -31,6 +32,9 @@ import com.azure.management.resources.models.SubscriptionClientBuilder; import com.azure.management.resources.models.SubscriptionClientImpl; +import java.util.ArrayList; +import java.util.List; + /** * Entry point to Azure resource management. */ @@ -133,8 +137,10 @@ public interface Authenticated { ResourceManager withSubscription(String subscriptionId); /** - * Specifies to use subscription from Azure profile. + * Specifies to use subscription from {@link AzureProfile}. If no subscription provided, we will + * try to set the only subscription if applicable returned by {@link Authenticated#subscriptions()}. * + * @throws RuntimeException more than one subscription found in the tenant. * @return the ResourceManager instance with entry points that work in a subscription */ ResourceManager withDefaultSubscription(); @@ -192,8 +198,25 @@ public ResourceManager withSubscription(String subscriptionId) { @Override public ResourceManager withDefaultSubscription() { if (profile.subscriptionId() == null) { - throw logger.logExceptionAsError( - new IllegalArgumentException("Please specify the subscription ID for resource management.")); + List subscriptions = new ArrayList<>(); + this.subscriptions().list().forEach(subscription -> { + //subscriptions.add(subscription); + }); + if (subscriptions.size() == 0) { + throw logger.logExceptionAsError( + new RuntimeException("Please create a subscription before you start resource management. " + + "To learn more, see: https://azure.microsoft.com/en-us/free/.")); + } else if (subscriptions.size() > 1) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("More than one subscription found in your tenant. " + + "Please specify which one below is desired for resource management."); + subscriptions.forEach(subscription -> { + stringBuilder.append("\n" + subscription.displayName() + " : " + subscription.subscriptionId()); + }); + throw logger.logExceptionAsError(new RuntimeException(stringBuilder.toString())); + } else { + profile.withSubscriptionId(subscriptions.get(0).subscriptionId()); + } } return new ResourceManager(httpPipeline, profile, sdkContext); } From c693a51fa3cfc754f52dfe44e99de31378c53530 Mon Sep 17 00:00:00 2001 From: xccc-msft Date: Tue, 19 May 2020 16:58:24 +0800 Subject: [PATCH 2/5] fix checkstyle --- .../azure/src/main/java/com/azure/management/Azure.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/management/azure/src/main/java/com/azure/management/Azure.java b/sdk/management/azure/src/main/java/com/azure/management/Azure.java index 4780f9d18873..47ad183d5db4 100644 --- a/sdk/management/azure/src/main/java/com/azure/management/Azure.java +++ b/sdk/management/azure/src/main/java/com/azure/management/Azure.java @@ -337,12 +337,12 @@ public Azure withDefaultSubscription() { }); if (subscriptions.size() == 0) { throw logger.logExceptionAsError( - new RuntimeException("Please create a subscription before you start resource management. " + - "To learn more, see: https://azure.microsoft.com/en-us/free/.")); + new RuntimeException("Please create a subscription before you start resource management. " + + "To learn more, see: https://azure.microsoft.com/en-us/free/.")); } else if (subscriptions.size() > 1) { StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("More than one subscription found in your tenant. " + - "Please specify which one below is desired for resource management."); + stringBuilder.append("More than one subscription found in your tenant. " + + "Please specify which one below is desired for resource management."); subscriptions.forEach(subscription -> { stringBuilder.append("\n" + subscription.displayName() + " : " + subscription.subscriptionId()); }); From 3f97d7f9b1859df2c3b7eceab12f76fcf48b2de5 Mon Sep 17 00:00:00 2001 From: xccc-msft Date: Tue, 19 May 2020 17:05:52 +0800 Subject: [PATCH 3/5] fix comment --- .../resources/implementation/ResourceManager.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java b/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java index 64c5e54fc9c1..0bb1c9ef7a42 100644 --- a/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java +++ b/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java @@ -200,16 +200,16 @@ public ResourceManager withDefaultSubscription() { if (profile.subscriptionId() == null) { List subscriptions = new ArrayList<>(); this.subscriptions().list().forEach(subscription -> { - //subscriptions.add(subscription); + subscriptions.add(subscription); }); if (subscriptions.size() == 0) { throw logger.logExceptionAsError( - new RuntimeException("Please create a subscription before you start resource management. " + - "To learn more, see: https://azure.microsoft.com/en-us/free/.")); + new RuntimeException("Please create a subscription before you start resource management. " + + "To learn more, see: https://azure.microsoft.com/en-us/free/.")); } else if (subscriptions.size() > 1) { StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("More than one subscription found in your tenant. " + - "Please specify which one below is desired for resource management."); + stringBuilder.append("More than one subscription found in your tenant. " + + "Please specify which one below is desired for resource management."); subscriptions.forEach(subscription -> { stringBuilder.append("\n" + subscription.displayName() + " : " + subscription.subscriptionId()); }); From 6195ffdeb86e644721914fb71d15595483cb094d Mon Sep 17 00:00:00 2001 From: xccc-msft Date: Wed, 20 May 2020 11:09:01 +0800 Subject: [PATCH 4/5] use IllegalStateException instead of RuntimeException --- .../main/java/com/azure/management/Azure.java | 28 ++------------- .../resources/fluentcore/utils/Utils.java | 36 ++++++++++++++++++- .../implementation/ResourceManager.java | 29 ++------------- 3 files changed, 41 insertions(+), 52 deletions(-) diff --git a/sdk/management/azure/src/main/java/com/azure/management/Azure.java b/sdk/management/azure/src/main/java/com/azure/management/Azure.java index 47ad183d5db4..db109977f73d 100644 --- a/sdk/management/azure/src/main/java/com/azure/management/Azure.java +++ b/sdk/management/azure/src/main/java/com/azure/management/Azure.java @@ -5,7 +5,6 @@ import com.azure.core.credential.TokenCredential; import com.azure.core.http.HttpPipeline; -import com.azure.core.util.logging.ClientLogger; import com.azure.management.appservice.AppServiceCertificateOrders; import com.azure.management.appservice.AppServiceCertificates; import com.azure.management.appservice.AppServiceDomains; @@ -85,6 +84,7 @@ import com.azure.management.resources.fluentcore.profile.AzureProfile; import com.azure.management.resources.fluentcore.utils.HttpPipelineProvider; import com.azure.management.resources.fluentcore.utils.SdkContext; +import com.azure.management.resources.fluentcore.utils.Utils; import com.azure.management.resources.implementation.ResourceManager; import com.azure.management.sql.SqlServers; import com.azure.management.sql.implementation.SqlServerManager; @@ -96,9 +96,6 @@ import com.azure.management.storage.Usages; import com.azure.management.storage.implementation.StorageManager; -import java.util.ArrayList; -import java.util.List; - /** The entry point for accessing resource management APIs in Azure. */ public final class Azure { private final ResourceManager resourceManager; @@ -237,7 +234,7 @@ public interface Authenticated extends AccessManagement { * AzureProfile}. If no default subscription provided, we will try to set the only * subscription if applicable returned by {@link Authenticated#subscriptions()}

* - * @throws RuntimeException more than one subscription found in the tenant. + * @throws IllegalStateException when no subscription or more than one subscription found in the tenant. * @return an authenticated Azure client configured to work with the default subscription */ Azure withDefaultSubscription(); @@ -245,7 +242,6 @@ public interface Authenticated extends AccessManagement { /** The implementation for the Authenticated interface. */ private static final class AuthenticatedImpl implements Authenticated { - private final ClientLogger logger = new ClientLogger(AuthenticatedImpl.class); private final HttpPipeline httpPipeline; private final AzureProfile profile; private final ResourceManager.Authenticated resourceManagerAuthenticated; @@ -331,25 +327,7 @@ public Azure withSubscription(String subscriptionId) { @Override public Azure withDefaultSubscription() { if (profile.subscriptionId() == null) { - List subscriptions = new ArrayList<>(); - this.subscriptions().list().forEach(subscription -> { - subscriptions.add(subscription); - }); - if (subscriptions.size() == 0) { - throw logger.logExceptionAsError( - new RuntimeException("Please create a subscription before you start resource management. " - + "To learn more, see: https://azure.microsoft.com/en-us/free/.")); - } else if (subscriptions.size() > 1) { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("More than one subscription found in your tenant. " - + "Please specify which one below is desired for resource management."); - subscriptions.forEach(subscription -> { - stringBuilder.append("\n" + subscription.displayName() + " : " + subscription.subscriptionId()); - }); - throw logger.logExceptionAsError(new RuntimeException(stringBuilder.toString())); - } else { - profile.withSubscriptionId(subscriptions.get(0).subscriptionId()); - } + profile.withSubscriptionId(Utils.subscriptionId(this.subscriptions().list())); } return new Azure(httpPipeline, profile, this); } diff --git a/sdk/resources/mgmt/src/main/java/com/azure/management/resources/fluentcore/utils/Utils.java b/sdk/resources/mgmt/src/main/java/com/azure/management/resources/fluentcore/utils/Utils.java index fdcbae74048f..ef17831a21d8 100644 --- a/sdk/resources/mgmt/src/main/java/com/azure/management/resources/fluentcore/utils/Utils.java +++ b/sdk/resources/mgmt/src/main/java/com/azure/management/resources/fluentcore/utils/Utils.java @@ -7,17 +7,24 @@ import com.azure.core.annotation.PathParam; import com.azure.core.http.HttpPipeline; import com.azure.core.http.HttpResponse; +import com.azure.core.http.rest.PagedIterable; import com.azure.core.http.rest.RestProxy; +import com.azure.core.util.logging.ClientLogger; +import com.azure.management.resources.Subscription; import com.azure.management.resources.fluentcore.arm.ResourceId; import com.azure.management.resources.fluentcore.model.Indexable; import reactor.core.publisher.Mono; +import java.util.ArrayList; import java.util.List; /** * Defines a few utilities. */ public final class Utils { + private Utils() { + } + /** * Converts an object Boolean to a primitive boolean. * @@ -179,6 +186,33 @@ private interface FileService { Mono download(@PathParam("url") String url); } - private Utils() { + /** + * Gets the only subscription in the tenant if applicable. + * + * @param subscriptions the list of subscriptions + * @throws IllegalStateException when no subscription or more than one subscription found + * @return the only subscription existing in the tenant + */ + public static String subscriptionId(PagedIterable subscriptions) { + List subscriptionList = new ArrayList<>(); + subscriptions.forEach(subscription -> { + subscriptionList.add(subscription); + }); + if (subscriptionList.size() == 0) { + throw new ClientLogger(Utils.class).logExceptionAsError( + new IllegalStateException("Please create a subscription before you start resource management. " + + "To learn more, see: https://azure.microsoft.com/en-us/free/.")); + } else if (subscriptionList.size() > 1) { + ClientLogger logger = new ClientLogger(Utils.class); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("More than one subscription found in your tenant. " + + "Please specify which one below is desired for resource management."); + subscriptionList.forEach(subscription -> { + stringBuilder.append("\n" + subscription.displayName() + " : " + subscription.subscriptionId()); + }); + throw new ClientLogger(Utils.class).logExceptionAsError( + new IllegalStateException(stringBuilder.toString())); + } + return subscriptionList.get(0).subscriptionId(); } } diff --git a/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java b/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java index 0bb1c9ef7a42..031c3e032af5 100644 --- a/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java +++ b/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java @@ -5,7 +5,6 @@ import com.azure.core.credential.TokenCredential; import com.azure.core.http.HttpPipeline; -import com.azure.core.util.logging.ClientLogger; import com.azure.management.resources.Deployments; import com.azure.management.resources.Features; import com.azure.management.resources.GenericResources; @@ -13,7 +12,6 @@ import com.azure.management.resources.PolicyDefinitions; import com.azure.management.resources.Providers; import com.azure.management.resources.ResourceGroups; -import com.azure.management.resources.Subscription; import com.azure.management.resources.Subscriptions; import com.azure.management.resources.Tenants; import com.azure.management.resources.fluentcore.arm.AzureConfigurable; @@ -23,6 +21,7 @@ import com.azure.management.resources.fluentcore.profile.AzureProfile; import com.azure.management.resources.fluentcore.utils.HttpPipelineProvider; import com.azure.management.resources.fluentcore.utils.SdkContext; +import com.azure.management.resources.fluentcore.utils.Utils; import com.azure.management.resources.models.FeatureClientBuilder; import com.azure.management.resources.models.FeatureClientImpl; import com.azure.management.resources.models.PolicyClientBuilder; @@ -32,9 +31,6 @@ import com.azure.management.resources.models.SubscriptionClientBuilder; import com.azure.management.resources.models.SubscriptionClientImpl; -import java.util.ArrayList; -import java.util.List; - /** * Entry point to Azure resource management. */ @@ -140,7 +136,7 @@ public interface Authenticated { * Specifies to use subscription from {@link AzureProfile}. If no subscription provided, we will * try to set the only subscription if applicable returned by {@link Authenticated#subscriptions()}. * - * @throws RuntimeException more than one subscription found in the tenant. + * @throws IllegalStateException when no subscription or more than one subscription found in the tenant. * @return the ResourceManager instance with entry points that work in a subscription */ ResourceManager withDefaultSubscription(); @@ -150,7 +146,6 @@ public interface Authenticated { * The implementation for Authenticated interface. */ private static final class AuthenticatedImpl implements Authenticated { - private final ClientLogger logger = new ClientLogger(AuthenticatedImpl.class); private HttpPipeline httpPipeline; private AzureProfile profile; private SdkContext sdkContext; @@ -198,25 +193,7 @@ public ResourceManager withSubscription(String subscriptionId) { @Override public ResourceManager withDefaultSubscription() { if (profile.subscriptionId() == null) { - List subscriptions = new ArrayList<>(); - this.subscriptions().list().forEach(subscription -> { - subscriptions.add(subscription); - }); - if (subscriptions.size() == 0) { - throw logger.logExceptionAsError( - new RuntimeException("Please create a subscription before you start resource management. " - + "To learn more, see: https://azure.microsoft.com/en-us/free/.")); - } else if (subscriptions.size() > 1) { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("More than one subscription found in your tenant. " - + "Please specify which one below is desired for resource management."); - subscriptions.forEach(subscription -> { - stringBuilder.append("\n" + subscription.displayName() + " : " + subscription.subscriptionId()); - }); - throw logger.logExceptionAsError(new RuntimeException(stringBuilder.toString())); - } else { - profile.withSubscriptionId(subscriptions.get(0).subscriptionId()); - } + profile.withSubscriptionId(Utils.subscriptionId(this.subscriptions().list())); } return new ResourceManager(httpPipeline, profile, sdkContext); } From e94f2f550586ed04f70c496411da916c6437b4a9 Mon Sep 17 00:00:00 2001 From: xccc-msft Date: Wed, 20 May 2020 12:53:24 +0800 Subject: [PATCH 5/5] update description --- .../azure/src/main/java/com/azure/management/Azure.java | 2 +- .../azure/management/resources/fluentcore/utils/Utils.java | 5 ++--- .../management/resources/implementation/ResourceManager.java | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/sdk/management/azure/src/main/java/com/azure/management/Azure.java b/sdk/management/azure/src/main/java/com/azure/management/Azure.java index db109977f73d..764b125b95c3 100644 --- a/sdk/management/azure/src/main/java/com/azure/management/Azure.java +++ b/sdk/management/azure/src/main/java/com/azure/management/Azure.java @@ -327,7 +327,7 @@ public Azure withSubscription(String subscriptionId) { @Override public Azure withDefaultSubscription() { if (profile.subscriptionId() == null) { - profile.withSubscriptionId(Utils.subscriptionId(this.subscriptions().list())); + profile.withSubscriptionId(Utils.defaultSubscription(this.subscriptions().list())); } return new Azure(httpPipeline, profile, this); } diff --git a/sdk/resources/mgmt/src/main/java/com/azure/management/resources/fluentcore/utils/Utils.java b/sdk/resources/mgmt/src/main/java/com/azure/management/resources/fluentcore/utils/Utils.java index ef17831a21d8..f10641592306 100644 --- a/sdk/resources/mgmt/src/main/java/com/azure/management/resources/fluentcore/utils/Utils.java +++ b/sdk/resources/mgmt/src/main/java/com/azure/management/resources/fluentcore/utils/Utils.java @@ -187,13 +187,13 @@ private interface FileService { } /** - * Gets the only subscription in the tenant if applicable. + * Gets the only subscription as the default one in the tenant if applicable. * * @param subscriptions the list of subscriptions * @throws IllegalStateException when no subscription or more than one subscription found * @return the only subscription existing in the tenant */ - public static String subscriptionId(PagedIterable subscriptions) { + public static String defaultSubscription(PagedIterable subscriptions) { List subscriptionList = new ArrayList<>(); subscriptions.forEach(subscription -> { subscriptionList.add(subscription); @@ -203,7 +203,6 @@ public static String subscriptionId(PagedIterable subscriptions) { new IllegalStateException("Please create a subscription before you start resource management. " + "To learn more, see: https://azure.microsoft.com/en-us/free/.")); } else if (subscriptionList.size() > 1) { - ClientLogger logger = new ClientLogger(Utils.class); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("More than one subscription found in your tenant. " + "Please specify which one below is desired for resource management."); diff --git a/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java b/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java index 031c3e032af5..33d5a7ad5a61 100644 --- a/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java +++ b/sdk/resources/mgmt/src/main/java/com/azure/management/resources/implementation/ResourceManager.java @@ -193,7 +193,7 @@ public ResourceManager withSubscription(String subscriptionId) { @Override public ResourceManager withDefaultSubscription() { if (profile.subscriptionId() == null) { - profile.withSubscriptionId(Utils.subscriptionId(this.subscriptions().list())); + profile.withSubscriptionId(Utils.defaultSubscription(this.subscriptions().list())); } return new ResourceManager(httpPipeline, profile, sdkContext); }