Sync eng/common directory with azure-sdk-tools for PR 9333 (#23703)
* Retry container deletion * Do not try to purge keyvaults with purge protection * Delete all blobs when container has immutability * Skip missing blob container properties * Fix null container --------- Co-authored-by: Ben Broderick Phillips <bebroder@microsoft.com>
This commit is contained in:
Родитель
d222f57af3
Коммит
df49cd69d2
|
@ -123,8 +123,8 @@ filter Remove-PurgeableResources {
|
||||||
switch ($r.AzsdkResourceType) {
|
switch ($r.AzsdkResourceType) {
|
||||||
'Key Vault' {
|
'Key Vault' {
|
||||||
if ($r.EnablePurgeProtection) {
|
if ($r.EnablePurgeProtection) {
|
||||||
# We will try anyway but will ignore errors.
|
|
||||||
Write-Warning "Key Vault '$($r.VaultName)' has purge protection enabled and may not be purged until $($r.ScheduledPurgeDate)"
|
Write-Warning "Key Vault '$($r.VaultName)' has purge protection enabled and may not be purged until $($r.ScheduledPurgeDate)"
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
# Use `-AsJob` to start a lightweight, cancellable job and pass to `Wait-PurgeableResoruceJob` for consistent behavior.
|
# Use `-AsJob` to start a lightweight, cancellable job and pass to `Wait-PurgeableResoruceJob` for consistent behavior.
|
||||||
|
@ -134,8 +134,8 @@ filter Remove-PurgeableResources {
|
||||||
|
|
||||||
'Managed HSM' {
|
'Managed HSM' {
|
||||||
if ($r.EnablePurgeProtection) {
|
if ($r.EnablePurgeProtection) {
|
||||||
# We will try anyway but will ignore errors.
|
|
||||||
Write-Warning "Managed HSM '$($r.Name)' has purge protection enabled and may not be purged until $($r.ScheduledPurgeDate)"
|
Write-Warning "Managed HSM '$($r.Name)' has purge protection enabled and may not be purged until $($r.ScheduledPurgeDate)"
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
# Use `GetNewClosure()` on the `-Action` ScriptBlock to make sure variables are captured.
|
# Use `GetNewClosure()` on the `-Action` ScriptBlock to make sure variables are captured.
|
||||||
|
@ -313,14 +313,16 @@ function RemoveStorageAccount($Account) {
|
||||||
if ($Account.Kind -eq "FileStorage") { return }
|
if ($Account.Kind -eq "FileStorage") { return }
|
||||||
|
|
||||||
$containers = New-AzStorageContext -StorageAccountName $Account.StorageAccountName | Get-AzStorageContainer
|
$containers = New-AzStorageContext -StorageAccountName $Account.StorageAccountName | Get-AzStorageContainer
|
||||||
$blobs = $containers | Get-AzStorageBlob
|
|
||||||
$deleteNow = @()
|
$deleteNow = @()
|
||||||
|
|
||||||
try {
|
try {
|
||||||
foreach ($blob in $blobs) {
|
foreach ($container in $containers) {
|
||||||
$shouldDelete = EnableBlobDeletion -Blob $blob -StorageAccountName $Account.StorageAccountName -ResourceGroupName $Account.ResourceGroupName
|
$blobs = $container | Get-AzStorageBlob
|
||||||
if ($shouldDelete) {
|
foreach ($blob in $blobs) {
|
||||||
$deleteNow += $blob
|
$shouldDelete = EnableBlobDeletion -Blob $blob -Container $container -StorageAccountName $Account.StorageAccountName -ResourceGroupName $Account.ResourceGroupName
|
||||||
|
if ($shouldDelete) {
|
||||||
|
$deleteNow += $blob
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
|
@ -342,11 +344,15 @@ function RemoveStorageAccount($Account) {
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($container in $containers) {
|
foreach ($container in $containers) {
|
||||||
|
if (!($container | Get-Member 'BlobContainerProperties')) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if ($container.BlobContainerProperties.HasImmutableStorageWithVersioning) {
|
if ($container.BlobContainerProperties.HasImmutableStorageWithVersioning) {
|
||||||
try {
|
try {
|
||||||
# Use AzRm cmdlet as deletion will only work through ARM with the immutability policies defined on the blobs
|
# Use AzRm cmdlet as deletion will only work through ARM with the immutability policies defined on the blobs
|
||||||
Remove-AzRmStorageContainer -Name $container.Name -StorageAccountName $Account.StorageAccountName -ResourceGroupName $Account.ResourceGroupName -Force
|
# Add a retry in case blob deletion has not finished in time for container deletion, but not too many that we end up
|
||||||
#$container | Remove-AzStorageContainer
|
# getting throttled by ARM/SRP if things are actually in a stuck state
|
||||||
|
Retry -Attempts 1 -Action { Remove-AzRmStorageContainer -Name $container.Name -StorageAccountName $Account.StorageAccountName -ResourceGroupName $Account.ResourceGroupName -Force }
|
||||||
} catch {
|
} catch {
|
||||||
Write-Host "Container removal failed: $($container.Name), account: $($Account.storageAccountName), group: $($Account.ResourceGroupName)"
|
Write-Host "Container removal failed: $($container.Name), account: $($Account.storageAccountName), group: $($Account.ResourceGroupName)"
|
||||||
Write-Warning "Ignoring the error and trying to delete the storage account"
|
Write-Warning "Ignoring the error and trying to delete the storage account"
|
||||||
|
@ -360,7 +366,7 @@ function RemoveStorageAccount($Account) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function EnableBlobDeletion($Blob, $StorageAccountName, $ResourceGroupName) {
|
function EnableBlobDeletion($Blob, $Container, $StorageAccountName, $ResourceGroupName) {
|
||||||
# Some properties like immutability policies require the blob to be
|
# Some properties like immutability policies require the blob to be
|
||||||
# deleted before the container can be deleted
|
# deleted before the container can be deleted
|
||||||
$forceBlobDeletion = $false
|
$forceBlobDeletion = $false
|
||||||
|
@ -394,6 +400,10 @@ function EnableBlobDeletion($Blob, $StorageAccountName, $ResourceGroupName) {
|
||||||
$Blob.ICloudBlob.BreakLease()
|
$Blob.ICloudBlob.BreakLease()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (($Container | Get-Member 'BlobContainerProperties') -and $Container.BlobContainerProperties.HasImmutableStorageWithVersioning) {
|
||||||
|
$forceBlobDeletion = $true
|
||||||
|
}
|
||||||
|
|
||||||
return $forceBlobDeletion
|
return $forceBlobDeletion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче