diff --git a/src/Resources/ResourceManager/Implementation/CmdletBase/ResourceManagerCmdletBase.cs b/src/Resources/ResourceManager/Implementation/CmdletBase/ResourceManagerCmdletBase.cs index a679c0a0ac08..d2885a0dcbf0 100644 --- a/src/Resources/ResourceManager/Implementation/CmdletBase/ResourceManagerCmdletBase.cs +++ b/src/Resources/ResourceManager/Implementation/CmdletBase/ResourceManagerCmdletBase.cs @@ -25,6 +25,7 @@ namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Extensions; using Microsoft.Azure.Commands.ResourceManager.Cmdlets.RestClients; using Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkClient; + using Microsoft.Rest.Azure; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; @@ -165,7 +166,7 @@ protected override void EndProcessing() /// /// The ProcessRecord method. /// - public override void ExecuteCmdlet() + public sealed override void ExecuteCmdlet() { try { @@ -412,6 +413,25 @@ private void DisposeOfCancellationSource() } } + /// + /// Gets the source exception from a captured exception. + /// + /// The captured exception + private static Exception GetSourceException(ExceptionDispatchInfo capturedException) + { + if (capturedException.SourceException is AggregateException aggregateException) + { + var innerException = aggregateException.InnerExceptions?.SingleOrDefault(); + + if (innerException != null) + { + return innerException; + } + } + + return capturedException.SourceException; + } + /// /// Provides specialized exception handling. /// @@ -420,33 +440,14 @@ private void HandleException(ExceptionDispatchInfo capturedException) { try { - var errorResponseException = capturedException.SourceException as ErrorResponseMessageException; - if (errorResponseException != null) - { - throw errorResponseException; - } + var sourceException = GetSourceException(capturedException); - var aggregateException = capturedException.SourceException as AggregateException; - if (aggregateException != null) + if (sourceException is CloudException cloudException) { - if (aggregateException.InnerExceptions.CoalesceEnumerable().Any() && - aggregateException.InnerExceptions.Count == 1) - { - errorResponseException = aggregateException.InnerExceptions.Single() as ErrorResponseMessageException; - if (errorResponseException != null) - { - throw errorResponseException; - } - - throw aggregateException.InnerExceptions.Single(); - } - else - { - throw aggregateException; - } + throw new ResourceManagerCloudException(cloudException); } - throw capturedException.SourceException; + throw sourceException; } finally { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/GetAzureManagementGroupDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/GetAzureManagementGroupDeploymentCmdlet.cs index 1817ba71a605..7d5aa017ae6b 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/GetAzureManagementGroupDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/GetAzureManagementGroupDeploymentCmdlet.cs @@ -53,7 +53,7 @@ public class GetAzureManagementGroupDeploymentCmdlet : ResourceManagerCmdletBase [ValidateNotNullOrEmpty] public string Id { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { FilterDeploymentOptions options = new FilterDeploymentOptions(DeploymentScopeType.ManagementGroup) { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/GetAzureManagementGroupDeploymentOperationCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/GetAzureManagementGroupDeploymentOperationCmdlet.cs index 3abeb3e8bafe..8be90b6c3fe2 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/GetAzureManagementGroupDeploymentOperationCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/GetAzureManagementGroupDeploymentOperationCmdlet.cs @@ -63,7 +63,7 @@ public class GetAzureManagementGroupDeploymentOperationCmdlet : ResourceManagerC Mandatory = true, ValueFromPipeline = true, HelpMessage = "The deployment object.")] public PSDeployment DeploymentObject { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var options = new FilterDeploymentOptions(DeploymentScopeType.ManagementGroup) { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/GetAzureSubscriptionDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/GetAzureSubscriptionDeploymentCmdlet.cs index e2714df28747..f69dc99ca6fc 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/GetAzureSubscriptionDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/GetAzureSubscriptionDeploymentCmdlet.cs @@ -49,7 +49,7 @@ public class GetAzureSubscriptionDeploymentCmdlet : ResourceManagerCmdletBase [ValidateNotNullOrEmpty] public string Id { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { FilterDeploymentOptions options = new FilterDeploymentOptions(DeploymentScopeType.Subscription) { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/GetAzureSubscriptionDeploymentOperationCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/GetAzureSubscriptionDeploymentOperationCmdlet.cs index 6aee7dfc2c7c..fc2d0d6c84ff 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/GetAzureSubscriptionDeploymentOperationCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/GetAzureSubscriptionDeploymentOperationCmdlet.cs @@ -51,7 +51,7 @@ public class GetAzureSubscriptionDeploymentOperationCmdlet : ResourceManagerCmdl ValueFromPipeline = true, HelpMessage = "The deployment object.")] public PSDeployment DeploymentObject { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var deploymentName = !string.IsNullOrEmpty(this.DeploymentName) ? this.DeploymentName : this.DeploymentObject.DeploymentName; diff --git a/src/Resources/ResourceManager/Implementation/Deployments/GetAzureTenantDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/GetAzureTenantDeploymentCmdlet.cs index bd8e9089c068..6f3725c72785 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/GetAzureTenantDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/GetAzureTenantDeploymentCmdlet.cs @@ -49,7 +49,7 @@ public class GetAzureTenantDeploymentCmdlet : ResourceManagerCmdletBase [ValidateNotNullOrEmpty] public string Id { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { FilterDeploymentOptions options = new FilterDeploymentOptions(DeploymentScopeType.Tenant) { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/GetAzureTenantDeploymentOperationCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/GetAzureTenantDeploymentOperationCmdlet.cs index d569e24de811..7c48e0fd801f 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/GetAzureTenantDeploymentOperationCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/GetAzureTenantDeploymentOperationCmdlet.cs @@ -55,7 +55,7 @@ public class GetAzureTenantDeploymentOperationCmdlet : ResourceManagerCmdletBase Mandatory = true, ValueFromPipeline = true, HelpMessage = "The deployment object.")] public PSDeployment DeploymentObject { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var options = new FilterDeploymentOptions(DeploymentScopeType.Tenant) { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/NewAzureManagementGroupDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/NewAzureManagementGroupDeploymentCmdlet.cs index 320d60947f4c..f34a9158d39b 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/NewAzureManagementGroupDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/NewAzureManagementGroupDeploymentCmdlet.cs @@ -52,7 +52,7 @@ public class NewAzureManagementGroupDeploymentCmdlet : ResourceWithParameterCmdl [Parameter(Mandatory = false, HelpMessage = "Run cmdlet in the background")] public SwitchParameter AsJob { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var parameters = new PSDeploymentCmdletParameters() { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/NewAzureSubscriptionDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/NewAzureSubscriptionDeploymentCmdlet.cs index 3de180307326..3159b0a930d0 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/NewAzureSubscriptionDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/NewAzureSubscriptionDeploymentCmdlet.cs @@ -50,7 +50,7 @@ public class NewAzureSubscriptionDeploymentCmdlet : ResourceWithParameterCmdletB [Parameter(Mandatory = false, HelpMessage = "Run cmdlet in the background")] public SwitchParameter AsJob { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var parameters = new PSDeploymentCmdletParameters() { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/NewAzureTenantDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/NewAzureTenantDeploymentCmdlet.cs index ee0c8780c939..f8f85c807597 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/NewAzureTenantDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/NewAzureTenantDeploymentCmdlet.cs @@ -48,7 +48,7 @@ public class NewAzureTenantDeploymentCmdlet : ResourceWithParameterCmdletBase, I [Parameter(Mandatory = false, HelpMessage = "Run cmdlet in the background")] public SwitchParameter AsJob { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var parameters = new PSDeploymentCmdletParameters() { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/RemoveAzureManagementGroupDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/RemoveAzureManagementGroupDeploymentCmdlet.cs index 56c22cc2f2e0..d0342b658c96 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/RemoveAzureManagementGroupDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/RemoveAzureManagementGroupDeploymentCmdlet.cs @@ -70,7 +70,7 @@ public class RemoveAzureManagementGroupDeploymentCmdlet : ResourceManagerCmdletB [Parameter(Mandatory = false)] public SwitchParameter PassThru { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { ConfirmAction( ProjectResources.DeleteDeploymentMessage, diff --git a/src/Resources/ResourceManager/Implementation/Deployments/RemoveAzureSubscriptionDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/RemoveAzureSubscriptionDeploymentCmdlet.cs index e1e8ac8920b0..1ec3b6dc0f3e 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/RemoveAzureSubscriptionDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/RemoveAzureSubscriptionDeploymentCmdlet.cs @@ -63,7 +63,7 @@ public class RemoveAzureSubscriptionDeploymentCmdlet : ResourceManagerCmdletBase [Parameter(Mandatory = false)] public SwitchParameter PassThru { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { ConfirmAction( ProjectResources.DeleteDeploymentMessage, diff --git a/src/Resources/ResourceManager/Implementation/Deployments/RemoveAzureTenantDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/RemoveAzureTenantDeploymentCmdlet.cs index 959befd4bafd..02e11a55bfe1 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/RemoveAzureTenantDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/RemoveAzureTenantDeploymentCmdlet.cs @@ -65,7 +65,7 @@ public class RemoveAzureTenantDeploymentCmdlet : ResourceManagerCmdletBase [Parameter(Mandatory = false)] public SwitchParameter PassThru { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { ConfirmAction( ProjectResources.DeleteDeploymentMessage, diff --git a/src/Resources/ResourceManager/Implementation/Deployments/StopAzureManagementGroupDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/StopAzureManagementGroupDeploymentCmdlet.cs index d13ab0795940..d3475391439b 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/StopAzureManagementGroupDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/StopAzureManagementGroupDeploymentCmdlet.cs @@ -67,7 +67,7 @@ public class StopAzureManagementGroupDeploymentCmdlet : ResourceManagerCmdletBas [Parameter(Mandatory = false)] public SwitchParameter PassThru { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var options = new FilterDeploymentOptions(DeploymentScopeType.ManagementGroup) { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/StopAzureSubscriptionDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/StopAzureSubscriptionDeploymentCmdlet.cs index c2dec03a49e2..03b0a375b6ed 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/StopAzureSubscriptionDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/StopAzureSubscriptionDeploymentCmdlet.cs @@ -62,7 +62,7 @@ public class StopAzureSubscriptionDeploymentCmdlet : ResourceManagerCmdletBase [Parameter(Mandatory = false)] public SwitchParameter PassThru { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var options = new FilterDeploymentOptions(DeploymentScopeType.Subscription) { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/StopAzureTenantDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/StopAzureTenantDeploymentCmdlet.cs index 02b1e90c3051..5e4a803ef7c5 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/StopAzureTenantDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/StopAzureTenantDeploymentCmdlet.cs @@ -62,7 +62,7 @@ public class StopAzureTenantDeploymentCmdlet : ResourceManagerCmdletBase [Parameter(Mandatory = false)] public SwitchParameter PassThru { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var options = new FilterDeploymentOptions(DeploymentScopeType.Tenant) { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/TestAzureManagementGroupDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/TestAzureManagementGroupDeploymentCmdlet.cs index b0786449dbdc..172dd09974a2 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/TestAzureManagementGroupDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/TestAzureManagementGroupDeploymentCmdlet.cs @@ -36,7 +36,7 @@ public class TestAzureManagementGroupDeploymentCmdlet : ResourceWithParameterCmd [ValidateNotNullOrEmpty] public string Location { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var parameters = new PSDeploymentCmdletParameters() { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/TestAzureSubscriptionDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/TestAzureSubscriptionDeploymentCmdlet.cs index 594bc101827e..00e87731505c 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/TestAzureSubscriptionDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/TestAzureSubscriptionDeploymentCmdlet.cs @@ -33,7 +33,7 @@ public class TestAzureSubscriptionDeploymentCmdlet : ResourceWithParameterCmdlet [ValidateNotNullOrEmpty] public string Location { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var parameters = new PSDeploymentCmdletParameters() { diff --git a/src/Resources/ResourceManager/Implementation/Deployments/TestAzureTenantDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/Deployments/TestAzureTenantDeploymentCmdlet.cs index 39be1266ab52..7b5b448a5937 100644 --- a/src/Resources/ResourceManager/Implementation/Deployments/TestAzureTenantDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Deployments/TestAzureTenantDeploymentCmdlet.cs @@ -33,7 +33,7 @@ public class TestAzureTenantDeploymentCmdlet : ResourceWithParameterCmdletBase, [ValidateNotNullOrEmpty] public string Location { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var parameters = new PSDeploymentCmdletParameters() { diff --git a/src/Resources/ResourceManager/Implementation/Locations/GetAzureLocationCmdlet.cs b/src/Resources/ResourceManager/Implementation/Locations/GetAzureLocationCmdlet.cs index c85fe9f71587..d39c9e6c0f94 100644 --- a/src/Resources/ResourceManager/Implementation/Locations/GetAzureLocationCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Locations/GetAzureLocationCmdlet.cs @@ -33,7 +33,7 @@ public class GetAzureLocationCmdlet : ResourceManagerCmdletBase /// /// Executes the cmdlet /// - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { if(DefaultContext.Subscription == null) { diff --git a/src/Resources/ResourceManager/Implementation/Policy/GetAzurePolicyAliasCmdlet.cs b/src/Resources/ResourceManager/Implementation/Policy/GetAzurePolicyAliasCmdlet.cs index 0a2e54fdf0ee..7db7d93772cc 100644 --- a/src/Resources/ResourceManager/Implementation/Policy/GetAzurePolicyAliasCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Policy/GetAzurePolicyAliasCmdlet.cs @@ -88,7 +88,7 @@ public class GetAzurePolicyAlias : ResourceManagerCmdletBase /// /// Executes the cmdlet /// - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { // remove leading and trailing whitespace this.NamespaceMatch = this.NamespaceMatch?.Trim() ?? string.Empty; diff --git a/src/Resources/ResourceManager/Implementation/Providers/GetAzureProviderCmdlet.cs b/src/Resources/ResourceManager/Implementation/Providers/GetAzureProviderCmdlet.cs index 9302e8438eed..3f4af757e196 100644 --- a/src/Resources/ResourceManager/Implementation/Providers/GetAzureProviderCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Providers/GetAzureProviderCmdlet.cs @@ -65,7 +65,7 @@ public class GetAzureProviderCmdlet : ResourceManagerCmdletBase /// /// Executes the cmdlet /// - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var providers = this.ListPSResourceProviders(); diff --git a/src/Resources/ResourceManager/Implementation/Providers/RegisterAzureProviderCmdlet.cs b/src/Resources/ResourceManager/Implementation/Providers/RegisterAzureProviderCmdlet.cs index 0361a9cdee62..8ba9a85b73df 100644 --- a/src/Resources/ResourceManager/Implementation/Providers/RegisterAzureProviderCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Providers/RegisterAzureProviderCmdlet.cs @@ -36,7 +36,7 @@ public class RegisterAzureProviderCmdlet : ResourceManagerCmdletBase /// /// Executes the cmdlet /// - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { this.ConfirmAction( processMessage: ProjectResources.RegisterProviderMessage, diff --git a/src/Resources/ResourceManager/Implementation/Providers/UnregisterAzureProviderCmdlet.cs b/src/Resources/ResourceManager/Implementation/Providers/UnregisterAzureProviderCmdlet.cs index d47fd447c7f2..08a9127eaf88 100644 --- a/src/Resources/ResourceManager/Implementation/Providers/UnregisterAzureProviderCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/Providers/UnregisterAzureProviderCmdlet.cs @@ -37,7 +37,7 @@ public class UnregisterAzureProviderCmdlet : ResourceManagerCmdletBase /// /// Executes the cmdlet /// - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { this.ConfirmAction( processMessage: ProjectResources.UnregisterProviderMessage, diff --git a/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/GetAzureResourceGroupDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/GetAzureResourceGroupDeploymentCmdlet.cs index c73ed2c0b787..c689f0ebeca1 100644 --- a/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/GetAzureResourceGroupDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/GetAzureResourceGroupDeploymentCmdlet.cs @@ -55,7 +55,7 @@ public class GetAzureResourceGroupDeploymentCmdlet : ResourceManagerCmdletBase [ValidateNotNullOrEmpty] public string Id { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { FilterDeploymentOptions options = new FilterDeploymentOptions(DeploymentScopeType.ResourceGroup) { diff --git a/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/NewAzureResourceGroupDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/NewAzureResourceGroupDeploymentCmdlet.cs index 97b4d9c32436..5361b8841584 100644 --- a/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/NewAzureResourceGroupDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/NewAzureResourceGroupDeploymentCmdlet.cs @@ -64,7 +64,7 @@ public NewAzureResourceGroupDeploymentCmdlet() this.Mode = DeploymentMode.Incremental; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { this.ConfirmAction( diff --git a/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/RemoveAzureResourceGroupDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/RemoveAzureResourceGroupDeploymentCmdlet.cs index 5fb98e592211..e06c5c072718 100644 --- a/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/RemoveAzureResourceGroupDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/RemoveAzureResourceGroupDeploymentCmdlet.cs @@ -54,7 +54,7 @@ public class RemoveAzureResourceGroupDeploymentCmdlet : ResourceManagerCmdletBas [ValidateNotNullOrEmpty] public string Id { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { ConfirmAction( ProjectResources.DeleteDeploymentMessage, diff --git a/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/StopAzureResourceGroupDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/StopAzureResourceGroupDeploymentCmdlet.cs index 30f91a50dffb..c0dedd0f8ea7 100644 --- a/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/StopAzureResourceGroupDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/StopAzureResourceGroupDeploymentCmdlet.cs @@ -56,7 +56,7 @@ public class StopAzureResourceGroupDeploymentCmdlet : ResourceManagerCmdletBase [ValidateNotNullOrEmpty] public string Id { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { var options = new FilterDeploymentOptions(DeploymentScopeType.ResourceGroup) { diff --git a/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/TestAzureResourceGroupDeploymentCmdlet.cs b/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/TestAzureResourceGroupDeploymentCmdlet.cs index 62219a5344fb..cb92c48b8614 100644 --- a/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/TestAzureResourceGroupDeploymentCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/ResourceGroupDeployments/TestAzureResourceGroupDeploymentCmdlet.cs @@ -51,7 +51,7 @@ public TestAzureResourceGroupDeploymentCmdlet() this.Mode = DeploymentMode.Incremental; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { if (RollbackToLastDeployment && !string.IsNullOrEmpty(RollBackDeploymentName)) { diff --git a/src/Resources/ResourceManager/Implementation/ResourceGroups/GetAzureResourceGroupCmdlet.cs b/src/Resources/ResourceManager/Implementation/ResourceGroups/GetAzureResourceGroupCmdlet.cs index ac6724b68374..616a79d684cc 100644 --- a/src/Resources/ResourceManager/Implementation/ResourceGroups/GetAzureResourceGroupCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/ResourceGroups/GetAzureResourceGroupCmdlet.cs @@ -63,7 +63,7 @@ public class GetAzureResourceGroupCmdlet : ResourceManagerCmdletBase [ValidateNotNullOrEmpty] public Hashtable Tag { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { Name = Name ?? ResourceIdentifier.FromResourceGroupIdentifier(this.Id).ResourceGroupName; this.WriteObject(ResourceManagerSdkClient.FilterResourceGroups(name: this.Name, tag: this.Tag, detailed: false, location: this.Location), true); diff --git a/src/Resources/ResourceManager/Implementation/ResourceGroups/NewAzureResourceGroupCmdlet.cs b/src/Resources/ResourceManager/Implementation/ResourceGroups/NewAzureResourceGroupCmdlet.cs index 2a8950d513fb..00342bc2226a 100644 --- a/src/Resources/ResourceManager/Implementation/ResourceGroups/NewAzureResourceGroupCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/ResourceGroups/NewAzureResourceGroupCmdlet.cs @@ -44,7 +44,7 @@ public class NewAzureResourceGroupCmdlet : ResourceManagerCmdletBase [Parameter(Mandatory = false, HelpMessage = "Do not ask for confirmation.")] public SwitchParameter Force { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { PSCreateResourceGroupParameters parameters = new PSCreateResourceGroupParameters { diff --git a/src/Resources/ResourceManager/Implementation/ResourceGroups/RemoveAzureResourceGroupCmdlet.cs b/src/Resources/ResourceManager/Implementation/ResourceGroups/RemoveAzureResourceGroupCmdlet.cs index 8958645e47b6..38c736b45708 100644 --- a/src/Resources/ResourceManager/Implementation/ResourceGroups/RemoveAzureResourceGroupCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/ResourceGroups/RemoveAzureResourceGroupCmdlet.cs @@ -54,7 +54,7 @@ public class RemoveAzureResourceGroupCmdlet : ResourceManagerCmdletBase [Parameter(Mandatory = false, HelpMessage = "Run cmdlet in the background")] public SwitchParameter AsJob { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { Name = Name ?? ResourceIdentifier.FromResourceGroupIdentifier(this.Id).ResourceGroupName; diff --git a/src/Resources/ResourceManager/Implementation/ResourceGroups/SetAzureResourceGroupCmdlet.cs b/src/Resources/ResourceManager/Implementation/ResourceGroups/SetAzureResourceGroupCmdlet.cs index eb6755c8d617..515f178645be 100644 --- a/src/Resources/ResourceManager/Implementation/ResourceGroups/SetAzureResourceGroupCmdlet.cs +++ b/src/Resources/ResourceManager/Implementation/ResourceGroups/SetAzureResourceGroupCmdlet.cs @@ -51,7 +51,7 @@ public class SetAzureResourceGroupCmdlet : ResourceManagerCmdletBase [ValidateNotNullOrEmpty] public string Id { get; set; } - public override void ExecuteCmdlet() + protected override void OnProcessRecord() { PSUpdateResourceGroupParameters parameters = new PSUpdateResourceGroupParameters { diff --git a/src/Resources/ResourceManager/RestClients/ResourceManagerRestClientBase.cs b/src/Resources/ResourceManager/RestClients/ResourceManagerRestClientBase.cs index 0d1e6ec65be9..10adc9cf9099 100644 --- a/src/Resources/ResourceManager/RestClients/ResourceManagerRestClientBase.cs +++ b/src/Resources/ResourceManager/RestClients/ResourceManagerRestClientBase.cs @@ -15,6 +15,7 @@ namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.RestClients { using System; + using System.Linq; using System.Net.Http; using System.Text; using System.Threading; @@ -263,11 +264,32 @@ protected async Task SendRequestAsync(HttpRequestMessage re /// The to read. /// The . /// - private static Task GetErrorMessage(HttpRequestMessage request, HttpResponseMessage response, ErrorResponseMessage errorResponse) + private static async Task GetErrorMessage(HttpRequestMessage request, HttpResponseMessage response, ErrorResponseMessage errorResponse) { - return errorResponse != null - ? Task.FromResult(string.Format("{0} : {1}", errorResponse.Error.Code, errorResponse.Error.Message)) - : response.Content.ReadAsStringAsync(); + var sb = new StringBuilder(); + + if (errorResponse != null) + { + sb.Append($"{errorResponse.Error.Code} : {errorResponse.Error.Message}"); + } + else + { + var rawResponse = await response.Content.ReadAsStringAsync(); + sb.Append(rawResponse); + } + + var headers = response?.Headers; + if (response?.Headers == null) + { + return sb.ToString(); + } + + if (response.Headers.TryGetValues("x-ms-correlation-request-id", out var correlationIds)) + { + sb.AppendLine().AppendFormat("CorrelationId: {0}", correlationIds.First()); + } + + return sb.ToString(); } /// diff --git a/src/Resources/ResourceManager/SdkClient/ResourceManagerCloudException.cs b/src/Resources/ResourceManager/SdkClient/ResourceManagerCloudException.cs new file mode 100644 index 000000000000..533b3da69f37 --- /dev/null +++ b/src/Resources/ResourceManager/SdkClient/ResourceManagerCloudException.cs @@ -0,0 +1,68 @@ +// ---------------------------------------------------------------------------------- +// +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +using Newtonsoft.Json; +using System.Net; +using System.Text; + +namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkClient +{ + public class ResourceManagerCloudException : Rest.Azure.CloudException + { + protected const string RequestIdHeaderInResponse = "x-ms-request-id"; + + public ResourceManagerCloudException(Rest.Azure.CloudException ex) + : base(GetErrorMessageWithRequestIdInfo(ex), ex) + { + } + + protected static string GetErrorMessageWithRequestIdInfo(Rest.Azure.CloudException cloudException) + { + if (cloudException == null) + { + return "No information in the cloud exception."; + } + + var sb = new StringBuilder(); + + if (!string.IsNullOrEmpty(cloudException.Message)) + { + sb.Append(cloudException.Message); + } + + if (cloudException.Response == null) + { + return sb.ToString(); + } + + if (!cloudException.Response.StatusCode.Equals(HttpStatusCode.OK)) + { + sb.AppendLine().AppendFormat("StatusCode: {0}", cloudException.Response.StatusCode.GetHashCode()); + sb.AppendLine().AppendFormat("ReasonPhrase: {0}", cloudException.Response.ReasonPhrase); + if (cloudException.Response.Headers == null + || !cloudException.Response.Headers.ContainsKey(RequestIdHeaderInResponse)) + { + return sb.ToString(); + } + + string operationId = cloudException.RequestId; + + sb.AppendLine().AppendFormat( + "OperationID : {0}", + operationId); + } + return sb.ToString(); + } + } +} diff --git a/src/Resources/Resources.Test/ScenarioTests/ResourceGroupTests.ps1 b/src/Resources/Resources.Test/ScenarioTests/ResourceGroupTests.ps1 index 7aaffc33bf2e..fc9e8b987016 100644 --- a/src/Resources/Resources.Test/ScenarioTests/ResourceGroupTests.ps1 +++ b/src/Resources/Resources.Test/ScenarioTests/ResourceGroupTests.ps1 @@ -262,7 +262,7 @@ function Test-RemoveDeployment # After deletion, try to get the given deployment should throw an error Get-AzResourceGroupDeployment -ResourceGroupName $rgName -Name $deploymentName -ErrorAction SilentlyContinue - Assert-True { $Error[0] -like "*Deployment 'Test' could not be found." } + Assert-True { $Error[0] -like "*Deployment 'Test' could not be found.*" } $Error.Clear() } finally diff --git a/src/Resources/Resources.Test/ScenarioTests/ResourceLockTests.ps1 b/src/Resources/Resources.Test/ScenarioTests/ResourceLockTests.ps1 index 006f4d15afec..420a82ef43fc 100644 --- a/src/Resources/Resources.Test/ScenarioTests/ResourceLockTests.ps1 +++ b/src/Resources/Resources.Test/ScenarioTests/ResourceLockTests.ps1 @@ -71,7 +71,7 @@ function Test-ResourceLockNonExisting $lock = Get-AzResourceLock -LockName "NonExisting" -Scope $rg.ResourceId -ErrorAction SilentlyContinue - Assert-True { $Error[0] -like "*LockNotFound : The lock 'NonExisting' could not be found." } + Assert-True { $Error[0] -like "*LockNotFound : The lock 'NonExisting' could not be found.*" } Assert-Null $lock $Error.Clear() diff --git a/src/Resources/Resources/ChangeLog.md b/src/Resources/Resources/ChangeLog.md index dc3045ebd2f1..2a42699d893b 100644 --- a/src/Resources/Resources/ChangeLog.md +++ b/src/Resources/Resources/ChangeLog.md @@ -18,6 +18,7 @@ - Additional information about change #1 --> ## Upcoming Release +* Add correlationId logging for error scenarios ## Version 1.12.0 * Fixed for null reference bug in `Get-AzRoleAssignment`