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:
Azure SDK Bot 2024-11-07 11:54:13 -08:00 коммит произвёл GitHub
Родитель d222f57af3
Коммит df49cd69d2
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
1 изменённых файлов: 20 добавлений и 10 удалений

Просмотреть файл

@ -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
} }