diff --git a/e2etest/zt_newe2e_basic_functionality_test.go b/e2etest/zt_newe2e_basic_functionality_test.go index d05f39862..238beb549 100644 --- a/e2etest/zt_newe2e_basic_functionality_test.go +++ b/e2etest/zt_newe2e_basic_functionality_test.go @@ -413,20 +413,35 @@ func (s *BasicFunctionalitySuite) Scenario_Copy_EmptySASErrorCodes(svm *Scenario } func (s *BasicFunctionalitySuite) Scenario_TagsPermission(svm *ScenarioVariationManager) { + objectType := ResolveVariation(svm, []common.EntityType{common.EEntityType.File(), common.EEntityType.Folder(), common.EEntityType.Symlink()}) + srcLoc := ResolveVariation(svm, []common.Location{common.ELocation.Local(), common.ELocation.Blob()}) - srcObj := CreateResource[ObjectResourceManager](svm, GetRootResource(svm, ResolveVariation(svm, []common.Location{common.ELocation.Local(), common.ELocation.Blob()})), ResourceDefinitionObject{ - Body: NewZeroObjectContentContainer(1024 * 1024 * 5), + // Local resource manager doesn't have symlink abilities yet, and the same codepath is hit. + if objectType == common.EEntityType.Symlink() && srcLoc == common.ELocation.Local() { + svm.InvalidateScenario() + return + } + + srcObj := CreateResource[ObjectResourceManager](svm, GetRootResource(svm, srcLoc), ResourceDefinitionObject{ + Body: common.Iff(objectType == common.EEntityType.File(), NewZeroObjectContentContainer(1024*1024*5), nil), + ObjectProperties: ObjectProperties{ + EntityType: objectType, + }, }) dstCt := CreateResource[ContainerResourceManager](svm, GetRootResource(svm, common.ELocation.Blob()), ResourceDefinitionContainer{}) - svm.InsertVariationSeparator("Blob-") - - blobType := ResolveVariation(svm, []common.BlobType{common.EBlobType.BlockBlob(), common.EBlobType.PageBlob(), common.EBlobType.AppendBlob()}) + svm.InsertVariationSeparator("Blob") - multiBlock := "single" - if blobType == common.EBlobType.BlockBlob() { + multiBlock := "single-block" + var blobType common.BlobType + if objectType == common.EEntityType.File() { svm.InsertVariationSeparator("-") - multiBlock = ResolveVariation(svm, []string{"single-block", "multi-block"}) + blobType = ResolveVariation(svm, []common.BlobType{common.EBlobType.BlockBlob(), common.EBlobType.PageBlob(), common.EBlobType.AppendBlob()}) + + if blobType == common.EBlobType.BlockBlob() { + svm.InsertVariationSeparator("-") + multiBlock = ResolveVariation(svm, []string{"single-block", "multi-block"}) + } } stdOut, _ := RunAzCopy( @@ -454,11 +469,14 @@ func (s *BasicFunctionalitySuite) Scenario_TagsPermission(svm *ScenarioVariation "alpha": PtrOf("beta"), }, CopySyncCommonFlags: CopySyncCommonFlags{ - BlockSizeMB: common.Iff(multiBlock != "single-block", + BlockSizeMB: common.Iff(objectType == common.EEntityType.File() && multiBlock != "single-block", PtrOf(0.5), nil), + Recursive: pointerTo(true), + IncludeDirectoryStubs: pointerTo(true), }, - BlobType: &blobType, + BlobType: &blobType, + PreserveSymlinks: pointerTo(true), }, ShouldFail: true, }, diff --git a/ste/sender-blobFolders.go b/ste/sender-blobFolders.go index 73ddc711b..b4aa650ce 100644 --- a/ste/sender-blobFolders.go +++ b/ste/sender-blobFolders.go @@ -199,17 +199,33 @@ func (b *blobFolderSender) EnsureFolderExists() error { } err = t.CreateFolder(b.DirUrlToString(), func() error { + blobTags := b.blobTagsToApply + setTags := separateSetTagsRequired(blobTags) + if setTags || len(blobTags) == 0 { + blobTags = nil + } + // It doesn't make sense to use a special access tier for a blob folder, the blob will be 0 bytes. _, err := b.destinationClient.Upload(b.jptm.Context(), streaming.NopCloser(bytes.NewReader(nil)), &blockblob.UploadOptions{ HTTPHeaders: &b.headersToApply, Metadata: b.metadataToApply, - Tags: b.blobTagsToApply, + Tags: blobTags, CPKInfo: b.jptm.CpkInfo(), CPKScopeInfo: b.jptm.CpkScopeInfo(), }) + if err != nil { + b.jptm.FailActiveSend(common.Iff(len(blobTags) > 0, "Upload symlink (with tags)", "Upload symlink"), err) + } - return err + if setTags { + if _, err := b.destinationClient.SetTags(b.jptm.Context(), b.blobTagsToApply, nil); err != nil { + b.jptm.FailActiveSend("Set tags", err) + return nil + } + } + + return nil }) if err != nil {