Skip to content

Commit da98874

Browse files
Merge pull request #875 from versity/fix/list-object-versions-versioning-disabled
fix: Fixed object versions listing with ListObjectVersions when versi…
2 parents 43a8458 + b39b5e2 commit da98874

File tree

5 files changed

+75
-19
lines changed

5 files changed

+75
-19
lines changed

backend/posix/posix.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -614,9 +614,6 @@ func (p *Posix) createObjVersion(bucket, key string, size int64, acc auth.Accoun
614614
}
615615

616616
func (p *Posix) ListObjectVersions(ctx context.Context, input *s3.ListObjectVersionsInput) (s3response.ListVersionsResult, error) {
617-
if !p.versioningEnabled() {
618-
return s3response.ListVersionsResult{}, nil
619-
}
620617
bucket := *input.Bucket
621618
var prefix, delim, keyMarker, versionIdMarker string
622619
var max int
@@ -734,6 +731,7 @@ func (p *Posix) fileToObjVersions(bucket string) backend.GetVersionsFunc {
734731
IsLatest: getBoolPtr(true),
735732
Size: &size,
736733
VersionId: &versionId,
734+
StorageClass: types.ObjectVersionStorageClassStandard,
737735
})
738736

739737
return &backend.ObjVersionFuncResult{
@@ -795,6 +793,7 @@ func (p *Posix) fileToObjVersions(bucket string) backend.GetVersionsFunc {
795793
Size: &size,
796794
VersionId: &versionId,
797795
IsLatest: getBoolPtr(true),
796+
StorageClass: types.ObjectVersionStorageClassStandard,
798797
})
799798
}
800799

@@ -888,6 +887,7 @@ func (p *Posix) fileToObjVersions(bucket string) backend.GetVersionsFunc {
888887
Size: &size,
889888
VersionId: &versionId,
890889
IsLatest: getBoolPtr(false),
890+
StorageClass: types.ObjectVersionStorageClassStandard,
891891
})
892892
}
893893

s3response/s3response.go

-1
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,6 @@ type ListVersionsResult struct {
385385
NextKeyMarker *string
386386
NextVersionIdMarker *string
387387
Prefix *string
388-
RequestCharged types.RequestCharged
389388
VersionIdMarker *string
390389
Versions []types.ObjectVersion `xml:"Version"`
391390
}

tests/integration/group-tests.go

+9
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ func TestListObjectsV2(s *S3Conf) {
191191
ListObjectsV2_list_all_objs(s)
192192
}
193193

194+
// VD stands for Versioning Disabled
195+
func TestListObjectVersions_VD(s *S3Conf) {
196+
ListObjectVersions_VD_success(s)
197+
}
198+
194199
func TestDeleteObject(s *S3Conf) {
195200
DeleteObject_non_existing_object(s)
196201
DeleteObject_directory_object_noslash(s)
@@ -449,6 +454,9 @@ func TestFullFlow(s *S3Conf) {
449454
TestGetObject(s)
450455
TestListObjects(s)
451456
TestListObjectsV2(s)
457+
if !s.versioningEnabled && !s.azureTests {
458+
TestListObjectVersions_VD(s)
459+
}
452460
TestDeleteObject(s)
453461
TestDeleteObjects(s)
454462
TestCopyObject(s)
@@ -708,6 +716,7 @@ func GetIntTests() IntTests {
708716
"ListObjectsV2_truncated_common_prefixes": ListObjectsV2_truncated_common_prefixes,
709717
"ListObjectsV2_all_objs_max_keys": ListObjectsV2_all_objs_max_keys,
710718
"ListObjectsV2_list_all_objs": ListObjectsV2_list_all_objs,
719+
"ListObjectVersions_VD_success": ListObjectVersions_VD_success,
711720
"DeleteObject_non_existing_object": DeleteObject_non_existing_object,
712721
"DeleteObject_directory_object_noslash": DeleteObject_directory_object_noslash,
713722
"DeleteObject_name_too_long": DeleteObject_name_too_long,

tests/integration/tests.go

+53-10
Original file line numberDiff line numberDiff line change
@@ -4279,6 +4279,47 @@ func ListObjectsV2_list_all_objs(s *S3Conf) error {
42794279
})
42804280
}
42814281

4282+
func ListObjectVersions_VD_success(s *S3Conf) error {
4283+
testName := "ListObjectVersions_VD_success"
4284+
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {
4285+
versions := []types.ObjectVersion{}
4286+
for i := 0; i < 5; i++ {
4287+
dLgth := int64(i * 100)
4288+
key := fmt.Sprintf("my-obj-%v", i)
4289+
out, err := putObjectWithData(dLgth, &s3.PutObjectInput{
4290+
Bucket: &bucket,
4291+
Key: &key,
4292+
}, s3client)
4293+
if err != nil {
4294+
return err
4295+
}
4296+
4297+
versions = append(versions, types.ObjectVersion{
4298+
ETag: out.res.ETag,
4299+
IsLatest: getBoolPtr(true),
4300+
Key: &key,
4301+
Size: &dLgth,
4302+
VersionId: getPtr("null"),
4303+
StorageClass: types.ObjectVersionStorageClassStandard,
4304+
})
4305+
}
4306+
4307+
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
4308+
res, err := s3client.ListObjectVersions(ctx, &s3.ListObjectVersionsInput{
4309+
Bucket: &bucket,
4310+
})
4311+
cancel()
4312+
if err != nil {
4313+
return err
4314+
}
4315+
4316+
if !compareVersions(res.Versions, versions) {
4317+
return fmt.Errorf("expected object versions output to be %v, instead got %v", versions, res.Versions)
4318+
}
4319+
return nil
4320+
})
4321+
}
4322+
42824323
func DeleteObject_non_existing_object(s *S3Conf) error {
42834324
testName := "DeleteObject_non_existing_object"
42844325
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {
@@ -10556,11 +10597,12 @@ func Versioning_CopyObject_success(s *S3Conf) error {
1055610597
dstObjVersions[0].IsLatest = getBoolPtr(false)
1055710598
versions := append([]types.ObjectVersion{
1055810599
{
10559-
ETag: out.CopyObjectResult.ETag,
10560-
IsLatest: getBoolPtr(true),
10561-
Key: &dstObj,
10562-
Size: &srcObjLen,
10563-
VersionId: out.VersionId,
10600+
ETag: out.CopyObjectResult.ETag,
10601+
IsLatest: getBoolPtr(true),
10602+
Key: &dstObj,
10603+
Size: &srcObjLen,
10604+
VersionId: out.VersionId,
10605+
StorageClass: types.ObjectVersionStorageClassStandard,
1056410606
},
1056510607
}, dstObjVersions...)
1056610608

@@ -11668,11 +11710,12 @@ func Versioning_Multipart_Upload_overwrite_an_object(s *S3Conf) error {
1166811710
objVersions[0].IsLatest = getBoolPtr(false)
1166911711
versions := append([]types.ObjectVersion{
1167011712
{
11671-
Key: &obj,
11672-
VersionId: res.VersionId,
11673-
ETag: res.ETag,
11674-
IsLatest: getBoolPtr(true),
11675-
Size: &size,
11713+
Key: &obj,
11714+
VersionId: res.VersionId,
11715+
ETag: res.ETag,
11716+
IsLatest: getBoolPtr(true),
11717+
Size: &size,
11718+
StorageClass: types.ObjectVersionStorageClassStandard,
1167611719
},
1167711720
}, objVersions...)
1167811721

tests/integration/utils.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -976,11 +976,12 @@ func createObjVersions(client *s3.Client, bucket, object string, count int) ([]t
976976
isLatest := i == count-1
977977

978978
versions = append(versions, types.ObjectVersion{
979-
ETag: r.res.ETag,
980-
IsLatest: &isLatest,
981-
Key: &object,
982-
Size: &dataLength,
983-
VersionId: r.res.VersionId,
979+
ETag: r.res.ETag,
980+
IsLatest: &isLatest,
981+
Key: &object,
982+
Size: &dataLength,
983+
VersionId: r.res.VersionId,
984+
StorageClass: types.ObjectVersionStorageClassStandard,
984985
})
985986
}
986987

@@ -1037,6 +1038,10 @@ func compareVersions(v1, v2 []types.ObjectVersion) bool {
10371038
if *version.ETag != *v2[i].ETag {
10381039
return false
10391040
}
1041+
1042+
if version.StorageClass != v2[i].StorageClass {
1043+
return false
1044+
}
10401045
}
10411046

10421047
return true

0 commit comments

Comments
 (0)