Skip to content

Commit 27357f9

Browse files
dantedallagNoriZC
andauthored
Fix validation error surfacing in Deployment Stack cmdlets. (#25122)
* Fix validation error surfacing in Deployment Stack cmdlets. Some validation errors were not being surfaced correctly because the exception type was not being accounted for. * Update ChangeLog.md --------- Co-authored-by: NoriZC <[email protected]>
1 parent da64873 commit 27357f9

File tree

9 files changed

+1291
-5026
lines changed

9 files changed

+1291
-5026
lines changed

src/Resources/ResourceManager/SdkClient/DeploymentStacksSdkClient.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -985,17 +985,33 @@ private ErrorDetail ConvertValidationExceptionToError(Exception ex)
985985
return null;
986986
}
987987

988-
var innerExceptionAsError = ConvertValidationExceptionToError(ex.InnerException);
989-
990988
if (ex is DeploymentStacksErrorException)
991989
{
992990
var stackEx = ex as DeploymentStacksErrorException;
993-
return new ErrorDetail(stackEx.Body?.Error.Code, stackEx.Body?.Error.Message, stackEx.Body?.Error.Target, innerExceptionAsError != null ? new ErrorDetail[] { innerExceptionAsError } : null);
991+
return new ErrorDetail(stackEx.Body?.Error.Code, stackEx.Body?.Error.Message, stackEx.Body?.Error.Target, stackEx.Body?.Error.Details);
992+
}
993+
else if (ex is CloudException)
994+
{
995+
var cloudEx = ex as CloudException;
996+
return new ErrorDetail(cloudEx.Body?.Code, cloudEx.Body?.Message, cloudEx.Body?.Target, ConvertCloudErrorListToErrorDetailList(cloudEx.Body?.Details));
994997
}
995998
else
996999
{
1000+
var innerExceptionAsError = ConvertValidationExceptionToError(ex.InnerException);
9971001
return new ErrorDetail(null, ex.Message, null, innerExceptionAsError != null ? new ErrorDetail[] { innerExceptionAsError } : null);
9981002
}
9991003
}
1004+
1005+
private IList<ErrorDetail> ConvertCloudErrorListToErrorDetailList(IList<CloudError> errors)
1006+
{
1007+
List<ErrorDetail> convertedErrors = new List<ErrorDetail>();
1008+
1009+
foreach (CloudError error in errors)
1010+
{
1011+
convertedErrors.Add(new ErrorDetail(error.Code, error.Message, error.Target, error.Details != null ? ConvertCloudErrorListToErrorDetailList(error.Details) : null));
1012+
}
1013+
1014+
return convertedErrors;
1015+
}
10001016
}
10011017
}

src/Resources/Resources.Test/ScenarioTests/DeploymentStackTests.ps1

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ function Test-NewResourceGroupDeploymentStack
102102
$badRGname = "badRG114172"
103103
$exceptionMessage = "Error: Code=ResourceGroupNotFound; Message=Resource group '$badRGname' could not be found"
104104
Assert-ThrowsContains { New-AzResourceGroupDeploymentStack -Name $rname -Description "A Stack" -ResourceGroup $badRGname -TemplateFile blankTemplate.json -DenySettingsMode None -ActionOnUnmanage DetachAll -Force } $exceptionMessage
105-
105+
106106
# --- ParameterFileTemplateFileParameterSetName ---
107107

108108
# Test - Success
@@ -114,6 +114,11 @@ function Test-NewResourceGroupDeploymentStack
114114
$exceptionMessage = "$missingFile' because it does not exist."
115115
Assert-ThrowsContains { New-AzResourceGroupDeploymentStack -Name $rname -Description "A Stack" -ResourceGroup $rgname -TemplateFile StacksRGTemplate.json -TemplateParameterFile $missingFile -DenySettingsMode None -Force } $exceptionMessage
116116

117+
# Test - Failure - Deployment Validation Error - Bad Storage Account Name
118+
119+
$exceptionMessage = "Storage account name must be between 3 and 24 characters in length"
120+
Assert-ThrowsContains { New-AzResourceGroupDeploymentStack -Name $rname -Description "A Stack" -ResourceGroup $rgName -TemplateFile StacksRGBadStorageAccountName.bicep -TemplateParameterFile StacksRGBadStorageAccountName.bicepparam -DenySettingsMode None -ActionOnUnmanage DetachAll -Force } $exceptionMessage
121+
117122
# --- ParameterObjectTemplateFileParameterSetName ---
118123

119124
# Test - Success (with BypassStackOutOfSyncError)
@@ -694,6 +699,9 @@ function Test-NewSubscriptionDeploymentStack
694699
$exceptionMessage = "$missingFile' because it does not exist."
695700
Assert-ThrowsContains { New-AzSubscriptionDeploymentStack -Name $rname -Description "A Stack" -TemplateFile StacksSubTemplate.json -TemplateParameterFile $missingFile -Location $location -DenySettingsMode None -ActionOnUnmanage DetachAll -Force } $exceptionMessage
696701

702+
$exceptionMessage = "The provided resource group name 'test23!!!' has these invalid characters"
703+
Assert-ThrowsContains { New-AzSubscriptionDeploymentStack -Name $rname -Description "A Stack" -Location $location -TemplateFile StacksSubBadRGName.bicep -TemplateParameterFile StacksSubBadRGName.bicepparam -DenySettingsMode None -ActionOnUnmanage DetachAll -Force } $exceptionMessage
704+
697705
# --- ParameterObjectTemplateFileParameterSetName (with BypassStackOutOfSyncError) ---
698706

699707
# Test - Success

src/Resources/Resources.Test/SessionRecords/Microsoft.Azure.Commands.Resources.Test.ScenarioTests.DeploymentStackTests/TestNewResourceGroupDeploymentStack.json

Lines changed: 647 additions & 4646 deletions
Large diffs are not rendered by default.

src/Resources/Resources.Test/SessionRecords/Microsoft.Azure.Commands.Resources.Test.ScenarioTests.DeploymentStackTests/TestNewSubscriptionDeploymentStack.json

Lines changed: 586 additions & 376 deletions
Large diffs are not rendered by default.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
targetScope = 'resourceGroup'
2+
3+
param location string = resourceGroup().location
4+
param name string
5+
var storageSku = 'Standard_LRS'
6+
7+
resource stg 'Microsoft.Storage/storageAccounts@2018-11-01' = {
8+
name: name
9+
location: location
10+
kind: 'Storage'
11+
sku: {
12+
name: storageSku
13+
}
14+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
using './StacksRGBadStorageAccountName.bicep'
2+
3+
param name = 'TEST123'
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
targetScope = 'subscription'
2+
3+
param rgname string
4+
param location string = deployment().location
5+
6+
resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = {
7+
name: rgname
8+
location: location
9+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
using './StacksSubBadRGName.bicep'
2+
3+
param rgname = 'test23!!!'

src/Resources/Resources/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
-->
2020

2121
## Upcoming Release
22+
* Fixed deployment stack validation error surfacing.
2223
* Fixed default formatting for output objects
2324
* Removed '-InputObject' for
2425
* `Get-AzPolicyAssignment`

0 commit comments

Comments
 (0)