diff --git a/e2etest/declarativeHelpers.go b/e2etest/declarativeHelpers.go index 54bc50018..49b48e190 100644 --- a/e2etest/declarativeHelpers.go +++ b/e2etest/declarativeHelpers.go @@ -533,6 +533,9 @@ type hookHelper interface { // GetDestination returns the destination Resource Manager GetDestination() resourceManager + + // GetSource returns the source Resource Manager + GetSource() resourceManager } // ///// diff --git a/e2etest/declarativeScenario.go b/e2etest/declarativeScenario.go index ef70a8657..9d448a7fc 100644 --- a/e2etest/declarativeScenario.go +++ b/e2etest/declarativeScenario.go @@ -858,3 +858,7 @@ func (s *scenario) GetAsserter() asserter { func (s *scenario) GetDestination() resourceManager { return s.state.dest } + +func (s *scenario) GetSource() resourceManager { + return s.state.source +} diff --git a/e2etest/zt_remove_test.go b/e2etest/zt_remove_test.go index 7003442ed..855b0c05d 100644 --- a/e2etest/zt_remove_test.go +++ b/e2etest/zt_remove_test.go @@ -21,6 +21,9 @@ package e2etest import ( + "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" + "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" + "github.com/Azure/azure-storage-azcopy/v10/common" "github.com/Azure/azure-storage-file-go/azfile" "testing" "time" @@ -65,4 +68,41 @@ func TestRemove_IncludeAfter(t *testing.T) { shouldTransfer: recreateFiles, shouldIgnore: skippedFiles, }, EAccountType.Standard(), EAccountType.Standard(), "") -} \ No newline at end of file +} + +func TestRemove_WithSnapshotsBlob(t *testing.T) { + blobRemove := TestFromTo{ + desc: "AllRemove", + useAllTos: true, + froms: []common.Location{ + common.ELocation.Blob(), + }, + tos: []common.Location{ + common.ELocation.Unknown(), + }, + } + RunScenarios(t, eOperation.Remove(), blobRemove, eValidate.Auto(), anonymousAuthOnly, anonymousAuthOnly, params{ + recursive: true, + }, &hooks{ + beforeRunJob: func(h hookHelper) { + blobClient := h.GetSource().(*resourceBlobContainer).containerClient.NewBlobClient("filea") + _, err := blobClient.CreateSnapshot(ctx, nil) + if err != nil { + t.Errorf("error creating snapshot %s", err) + } + }, + afterValidation: func(h hookHelper) { + blobClient := h.GetSource().(*resourceBlobContainer).containerClient.NewBlobClient("filea") + _, err := blobClient.Delete(ctx, &blob.DeleteOptions{DeleteSnapshots: to.Ptr(blob.DeleteSnapshotsOptionTypeInclude)}) + if err != nil { + t.Errorf("error deleting blob %s", err) + } + }, + }, testFiles{ + defaultSize: "1K", + shouldSkip: []interface{}{ + f("filea"), + }, + objectTarget: "filea", + }, EAccountType.Standard(), EAccountType.Standard(), "") +} diff --git a/ste/xfer-deleteBlob.go b/ste/xfer-deleteBlob.go index d67a0f725..d1f1eaada 100644 --- a/ste/xfer-deleteBlob.go +++ b/ste/xfer-deleteBlob.go @@ -62,7 +62,7 @@ func doDeleteBlob(jptm IJobPartTransferMgr, p pipeline.Pipeline) { // we still count this delete operation as successful since we accomplished the desired outcome _, err := blobClient.Delete(jptm.Context(), &blob.DeleteOptions{ DeleteSnapshots: jptm.DeleteSnapshotsOption().ToDeleteSnapshotsOptionType(), - BlobDeleteType: jptm.PermanentDeleteOption().ToPermanentDeleteOptionType(), + BlobDeleteType: jptm.PermanentDeleteOption().ToPermanentDeleteOptionType(), }) if err != nil { var respErr *azcore.ResponseError @@ -70,7 +70,6 @@ func doDeleteBlob(jptm IJobPartTransferMgr, p pipeline.Pipeline) { // if the delete failed with err 404, i.e resource not found, then mark the transfer as success. if respErr.StatusCode == http.StatusNotFound { transferDone(common.ETransferStatus.Success(), nil) - } return } // if the delete failed because the blob has snapshots, then skip it @@ -85,6 +84,7 @@ func doDeleteBlob(jptm IJobPartTransferMgr, p pipeline.Pipeline) { jptm.Log(pipeline.LogError, errMsg) common.GetLifecycleMgr().Error(errMsg) } + } // in all other cases, make the transfer as failed transferDone(common.ETransferStatus.Failed(), err) } else {