Skip to content

Commit 3cd8d07

Browse files
authored
[Storage] Support container softdelete (Azure#15284)
* [Storage] Support container softdelete * fix CI failure * revise per review comment
1 parent 1e84e5a commit 3cd8d07

35 files changed

+2728
-287
lines changed

src/Storage/Storage.Management.Test/ScenarioTests/StorageBlobTests.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,13 @@ public void TestStorageBlobRestore()
9292
public void TestStorageBlobChangeFeed()
9393
{
9494
TestController.NewInstance.RunPsTest(_logger, "Test-StorageBlobChangeFeed");
95-
}
95+
}
96+
97+
[Fact]
98+
[Trait(Category.AcceptanceType, Category.CheckIn)]
99+
public void TestStorageBlobContainerSoftDelete()
100+
{
101+
TestController.NewInstance.RunPsTest(_logger, "Test-StorageBlobContainerSoftDelete");
102+
}
96103
}
97104
}

src/Storage/Storage.Management.Test/ScenarioTests/StorageBlobTests.ps1

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,3 +757,65 @@ function Test-StorageBlobChangeFeed
757757
}
758758

759759

760+
761+
<#
762+
.SYNOPSIS
763+
Test StorageAccount Blob Container SoftDelete in Service Properties
764+
.DESCRIPTION
765+
SmokeTest
766+
#>
767+
function Test-StorageBlobContainerSoftDelete
768+
{
769+
# Setup
770+
$rgname = Get-StorageManagementTestResourceName;
771+
772+
try
773+
{
774+
# Test
775+
$stoname = 'sto' + $rgname;
776+
$stotype = 'Standard_GRS';
777+
$loc = Get-ProviderLocation_Canary ResourceManagement;
778+
$kind = 'StorageV2'
779+
780+
Write-Verbose "RGName: $rgname | Loc: $loc"
781+
New-AzResourceGroup -Name $rgname -Location $loc;
782+
783+
New-AzStorageAccount -ResourceGroupName $rgname -Name $stoname -Location $loc -Type $stotype -Kind $kind
784+
$stos = Get-AzStorageAccount -ResourceGroupName $rgname;
785+
786+
# Enable Blob Delete Retention Policy
787+
$policy = Enable-AzStorageContainerDeleteRetentionPolicy -ResourceGroupName $rgname -StorageAccountName $stoname -PassThru -RetentionDays 30
788+
Assert-AreEqual $true $policy.Enabled
789+
Assert-AreEqual 30 $policy.Days
790+
$property = Get-AzStorageBlobServiceProperty -ResourceGroupName $rgname -StorageAccountName $stoname
791+
Assert-AreEqual $true $property.ContainerDeleteRetentionPolicy.Enabled
792+
Assert-AreEqual 30 $property.ContainerDeleteRetentionPolicy.Days
793+
794+
# Create and delete container, then get container
795+
$contaierName = "testcontaienr"
796+
New-AzRmStorageContainer -ResourceGroupName $rgname -StorageAccountName $stoname -Name $contaierName
797+
Remove-AzRmStorageContainer -ResourceGroupName $rgname -StorageAccountName $stoname -Name $contaierName -Force
798+
$cons = Get-AzRmStorageContainer -ResourceGroupName $rgname -StorageAccountName $stoname
799+
Assert-AreEqual 0 $cons.Count
800+
$cons = Get-AzRmStorageContainer -ResourceGroupName $rgname -StorageAccountName $stoname -IncludeDeleted
801+
Assert-AreEqual 1 $cons.Count
802+
Assert-AreEqual $contaierName $cons[0].Name
803+
Assert-AreEqual $true $cons[0].Deleted
804+
805+
806+
# Disable Blob Delete Retention Policy
807+
$policy = Disable-AzStorageContainerDeleteRetentionPolicy -ResourceGroupName $rgname -StorageAccountName $stoname -PassThru
808+
Assert-AreEqual $false $policy.Enabled
809+
$property = Get-AzStorageBlobServiceProperty -ResourceGroupName $rgname -StorageAccountName $stoname
810+
Assert-AreEqual $false $property.ContainerDeleteRetentionPolicy.Enabled
811+
812+
Remove-AzStorageAccount -Force -ResourceGroupName $rgname -Name $stoname;
813+
}
814+
finally
815+
{
816+
# Cleanup
817+
Clean-ResourceGroup $rgname
818+
}
819+
}
820+
821+

src/Storage/Storage.Management.Test/ScenarioTests/StorageDataPlaneTests.ps1

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -278,28 +278,52 @@ function Test-Blob
278278
Assert-AreEqual $blob.Count 2
279279
Assert-AreEqual $blob[0].ICloudBlob.IsSnapshot $true
280280
Assert-AreEqual $blob[1].ICloudBlob.IsSnapshot $false
281-
282-
#Upload Blob with properties to container which enabled Immutability Policy
283-
Set-AzRmStorageContainerImmutabilityPolicy -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName -ContainerName $containerName -ImmutabilityPeriod 1
281+
282+
#Upload Blob with properties to container which enabled Immutability Policy
283+
Set-AzRmStorageContainerImmutabilityPolicy -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName -ContainerName $containerName -ImmutabilityPeriod 1
284284
Set-AzStorageBlobContent -File $localSrcFile -Container $containerName -Blob immublob -Force -Properties @{"CacheControl" = "max-age=31536000, private"; "ContentEncoding" = "gzip"; "ContentDisposition" = "123"; "ContentLanguage" = "1234"; "ContentType" = "abc/12345"; } -Metadata @{"tag1" = "value1"; "tag2" = "value22" } -Context $storageContext
285-
286-
$immutabilityPolicy = Get-AzRmStorageContainerImmutabilityPolicy -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName -ContainerName $containerName
287-
Remove-AzRmStorageContainerImmutabilityPolicy -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName -ContainerName $containerName -Etag $immutabilityPolicy.Etag
288-
289-
# Encryption Scope Test
290-
$scopename = "testscope"
291-
$scopename2 = "testscope2"
292-
$containerName2 = "testscopecontainer"
293-
New-AzStorageEncryptionScope -ResourceGroupName $ResourceGroupName -StorageAccountName $storageAccountName -EncryptionScopeName $scopename -StorageEncryption
294-
New-AzStorageEncryptionScope -ResourceGroupName $ResourceGroupName -StorageAccountName $storageAccountName -EncryptionScopeName $scopename2 -StorageEncryption
295-
$container = New-AzStorageContainer -Name $containerName2 -Context $storageContext -DefaultEncryptionScope $scopeName -PreventEncryptionScopeOverride $true
296-
Assert-AreEqual $scopename $container.BlobContainerProperties.DefaultEncryptionScope
297-
Assert-AreEqual $true $container.BlobContainerProperties.PreventEncryptionScopeOverride
298-
$blob = Set-AzStorageBlobContent -Context $storageContext -File $localSrcFile -Container $containerName -Blob encryscopetest -EncryptionScope $scopename
299-
Assert-AreEqual $scopename $blob.BlobProperties.EncryptionScope
300-
$blob = Copy-AzStorageBlob -Context $storageContext -SrcContainer $containerName -SrcBlob encryscopetest -DestContainer $containerName -DestBlob encryscopetest -Force -EncryptionScope $scopename2
301-
Assert-AreEqual $scopename2 $blob.BlobProperties.EncryptionScope
302-
Remove-AzStorageContainer -Name $containerName2 -Force -Context $storageContext
285+
286+
$immutabilityPolicy = Get-AzRmStorageContainerImmutabilityPolicy -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName -ContainerName $containerName
287+
Remove-AzRmStorageContainerImmutabilityPolicy -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName -ContainerName $containerName -Etag $immutabilityPolicy.Etag
288+
289+
# Encryption Scope Test
290+
$scopename = "testscope"
291+
$scopename2 = "testscope2"
292+
$containerName2 = "testscopecontainer"
293+
New-AzStorageEncryptionScope -ResourceGroupName $ResourceGroupName -StorageAccountName $storageAccountName -EncryptionScopeName $scopename -StorageEncryption
294+
New-AzStorageEncryptionScope -ResourceGroupName $ResourceGroupName -StorageAccountName $storageAccountName -EncryptionScopeName $scopename2 -StorageEncryption
295+
$container = New-AzStorageContainer -Name $containerName2 -Context $storageContext -DefaultEncryptionScope $scopeName -PreventEncryptionScopeOverride $true
296+
Assert-AreEqual $scopename $container.BlobContainerProperties.DefaultEncryptionScope
297+
Assert-AreEqual $true $container.BlobContainerProperties.PreventEncryptionScopeOverride
298+
$blob = Set-AzStorageBlobContent -Context $storageContext -File $localSrcFile -Container $containerName -Blob encryscopetest -EncryptionScope $scopename
299+
Assert-AreEqual $scopename $blob.BlobProperties.EncryptionScope
300+
$blob = Copy-AzStorageBlob -Context $storageContext -SrcContainer $containerName -SrcBlob encryscopetest -DestContainer $containerName -DestBlob encryscopetest -Force -EncryptionScope $scopename2
301+
Assert-AreEqual $scopename2 $blob.BlobProperties.EncryptionScope
302+
Remove-AzStorageContainer -Name $containerName2 -Force -Context $storageContext
303+
304+
# container softdelete test
305+
## Enabled container softdelete,then create and delete a container
306+
Enable-AzStorageContainerDeleteRetentionPolicy -ResourceGroupName $ResourceGroupName -Name $StorageAccountName -RetentionDays 3
307+
$containerNamesoftdelete = "softdeletecontainer"
308+
New-AzStorageContainer -Name $containerNamesoftdelete -Context $storageContext
309+
Remove-AzStorageContainer -Name $containerNamesoftdelete -Context $storageContext -Force
310+
## Get container without -IncludeDeleted, won't list out deleted containers
311+
$deletedcontainer = Get-AzStorageContainer -Context $storageContext | ?{$_.IsDeleted}
312+
Assert-AreEqual 0 $deletedcontainer.Count
313+
## Get container with -IncludeDeleted, will list out deleted containers
314+
$deletedcontainer = Get-AzStorageContainer -Context $storageContext -IncludeDeleted | ?{$_.IsDeleted}
315+
Assert-AreEqual 1 $deletedcontainer.Count
316+
Assert-AreEqual $true $deletedcontainer.IsDeleted
317+
Assert-NotNull $deletedcontainer.VersionId
318+
## restore container with pipeline, to same container name
319+
sleep 60 # need wait for some time, or restore will fail with 409 (The specified container is being deleted.)
320+
$deletedcontainer | Restore-AzStorageContainer
321+
$container = Get-AzStorageContainer -Name $containerNamesoftdelete -Context $storageContext
322+
Assert-AreEqual 1 $container.Count
323+
Assert-Null $container.IsDeleted
324+
Assert-Null $container.VersionId
325+
Disable-AzStorageContainerDeleteRetentionPolicy -ResourceGroupName $ResourceGroupName -Name $StorageAccountName
326+
Remove-AzStorageContainer -Name $containerNamesoftdelete -Context $storageContext -Force
303327

304328
# Clean Storage Account
305329
Remove-AzStorageContainer -Name $containerName -Force -Context $storageContext

0 commit comments

Comments
 (0)