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`