From b39b5e2373280ac54aae54436666df791b880f07 Mon Sep 17 00:00:00 2001 From: jonaustin09 Date: Mon, 7 Oct 2024 18:16:11 -0400 Subject: [PATCH] fix: Fixed object versions listing with ListObjectVersions when versioning is not configured for the gateway --- backend/posix/posix.go | 6 +-- s3response/s3response.go | 1 - tests/integration/group-tests.go | 9 +++++ tests/integration/tests.go | 63 +++++++++++++++++++++++++++----- tests/integration/utils.go | 15 +++++--- 5 files changed, 75 insertions(+), 19 deletions(-) diff --git a/backend/posix/posix.go b/backend/posix/posix.go index 75bdcfb..d62d0aa 100644 --- a/backend/posix/posix.go +++ b/backend/posix/posix.go @@ -614,9 +614,6 @@ func (p *Posix) createObjVersion(bucket, key string, size int64, acc auth.Accoun } func (p *Posix) ListObjectVersions(ctx context.Context, input *s3.ListObjectVersionsInput) (s3response.ListVersionsResult, error) { - if !p.versioningEnabled() { - return s3response.ListVersionsResult{}, nil - } bucket := *input.Bucket var prefix, delim, keyMarker, versionIdMarker string var max int @@ -734,6 +731,7 @@ func (p *Posix) fileToObjVersions(bucket string) backend.GetVersionsFunc { IsLatest: getBoolPtr(true), Size: &size, VersionId: &versionId, + StorageClass: types.ObjectVersionStorageClassStandard, }) return &backend.ObjVersionFuncResult{ @@ -795,6 +793,7 @@ func (p *Posix) fileToObjVersions(bucket string) backend.GetVersionsFunc { Size: &size, VersionId: &versionId, IsLatest: getBoolPtr(true), + StorageClass: types.ObjectVersionStorageClassStandard, }) } @@ -888,6 +887,7 @@ func (p *Posix) fileToObjVersions(bucket string) backend.GetVersionsFunc { Size: &size, VersionId: &versionId, IsLatest: getBoolPtr(false), + StorageClass: types.ObjectVersionStorageClassStandard, }) } diff --git a/s3response/s3response.go b/s3response/s3response.go index c538e89..e2e2163 100644 --- a/s3response/s3response.go +++ b/s3response/s3response.go @@ -385,7 +385,6 @@ type ListVersionsResult struct { NextKeyMarker *string NextVersionIdMarker *string Prefix *string - RequestCharged types.RequestCharged VersionIdMarker *string Versions []types.ObjectVersion `xml:"Version"` } diff --git a/tests/integration/group-tests.go b/tests/integration/group-tests.go index a071090..23e9e07 100644 --- a/tests/integration/group-tests.go +++ b/tests/integration/group-tests.go @@ -191,6 +191,11 @@ func TestListObjectsV2(s *S3Conf) { ListObjectsV2_list_all_objs(s) } +// VD stands for Versioning Disabled +func TestListObjectVersions_VD(s *S3Conf) { + ListObjectVersions_VD_success(s) +} + func TestDeleteObject(s *S3Conf) { DeleteObject_non_existing_object(s) DeleteObject_directory_object_noslash(s) @@ -449,6 +454,9 @@ func TestFullFlow(s *S3Conf) { TestGetObject(s) TestListObjects(s) TestListObjectsV2(s) + if !s.versioningEnabled && !s.azureTests { + TestListObjectVersions_VD(s) + } TestDeleteObject(s) TestDeleteObjects(s) TestCopyObject(s) @@ -708,6 +716,7 @@ func GetIntTests() IntTests { "ListObjectsV2_truncated_common_prefixes": ListObjectsV2_truncated_common_prefixes, "ListObjectsV2_all_objs_max_keys": ListObjectsV2_all_objs_max_keys, "ListObjectsV2_list_all_objs": ListObjectsV2_list_all_objs, + "ListObjectVersions_VD_success": ListObjectVersions_VD_success, "DeleteObject_non_existing_object": DeleteObject_non_existing_object, "DeleteObject_directory_object_noslash": DeleteObject_directory_object_noslash, "DeleteObject_name_too_long": DeleteObject_name_too_long, diff --git a/tests/integration/tests.go b/tests/integration/tests.go index 07ac9f5..3331577 100644 --- a/tests/integration/tests.go +++ b/tests/integration/tests.go @@ -4279,6 +4279,47 @@ func ListObjectsV2_list_all_objs(s *S3Conf) error { }) } +func ListObjectVersions_VD_success(s *S3Conf) error { + testName := "ListObjectVersions_VD_success" + return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { + versions := []types.ObjectVersion{} + for i := 0; i < 5; i++ { + dLgth := int64(i * 100) + key := fmt.Sprintf("my-obj-%v", i) + out, err := putObjectWithData(dLgth, &s3.PutObjectInput{ + Bucket: &bucket, + Key: &key, + }, s3client) + if err != nil { + return err + } + + versions = append(versions, types.ObjectVersion{ + ETag: out.res.ETag, + IsLatest: getBoolPtr(true), + Key: &key, + Size: &dLgth, + VersionId: getPtr("null"), + StorageClass: types.ObjectVersionStorageClassStandard, + }) + } + + ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) + res, err := s3client.ListObjectVersions(ctx, &s3.ListObjectVersionsInput{ + Bucket: &bucket, + }) + cancel() + if err != nil { + return err + } + + if !compareVersions(res.Versions, versions) { + return fmt.Errorf("expected object versions output to be %v, instead got %v", versions, res.Versions) + } + return nil + }) +} + func DeleteObject_non_existing_object(s *S3Conf) error { testName := "DeleteObject_non_existing_object" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { @@ -10556,11 +10597,12 @@ func Versioning_CopyObject_success(s *S3Conf) error { dstObjVersions[0].IsLatest = getBoolPtr(false) versions := append([]types.ObjectVersion{ { - ETag: out.CopyObjectResult.ETag, - IsLatest: getBoolPtr(true), - Key: &dstObj, - Size: &srcObjLen, - VersionId: out.VersionId, + ETag: out.CopyObjectResult.ETag, + IsLatest: getBoolPtr(true), + Key: &dstObj, + Size: &srcObjLen, + VersionId: out.VersionId, + StorageClass: types.ObjectVersionStorageClassStandard, }, }, dstObjVersions...) @@ -11668,11 +11710,12 @@ func Versioning_Multipart_Upload_overwrite_an_object(s *S3Conf) error { objVersions[0].IsLatest = getBoolPtr(false) versions := append([]types.ObjectVersion{ { - Key: &obj, - VersionId: res.VersionId, - ETag: res.ETag, - IsLatest: getBoolPtr(true), - Size: &size, + Key: &obj, + VersionId: res.VersionId, + ETag: res.ETag, + IsLatest: getBoolPtr(true), + Size: &size, + StorageClass: types.ObjectVersionStorageClassStandard, }, }, objVersions...) diff --git a/tests/integration/utils.go b/tests/integration/utils.go index eb3fe52..e5e6a18 100644 --- a/tests/integration/utils.go +++ b/tests/integration/utils.go @@ -976,11 +976,12 @@ func createObjVersions(client *s3.Client, bucket, object string, count int) ([]t isLatest := i == count-1 versions = append(versions, types.ObjectVersion{ - ETag: r.res.ETag, - IsLatest: &isLatest, - Key: &object, - Size: &dataLength, - VersionId: r.res.VersionId, + ETag: r.res.ETag, + IsLatest: &isLatest, + Key: &object, + Size: &dataLength, + VersionId: r.res.VersionId, + StorageClass: types.ObjectVersionStorageClassStandard, }) } @@ -1037,6 +1038,10 @@ func compareVersions(v1, v2 []types.ObjectVersion) bool { if *version.ETag != *v2[i].ETag { return false } + + if version.StorageClass != v2[i].StorageClass { + return false + } } return true