fix: Fixed object versions listing with ListObjectVersions when versioning is not configured for the gateway

This commit is contained in:
jonaustin09
2024-10-07 18:16:11 -04:00
parent f388859d18
commit b39b5e2373
5 changed files with 75 additions and 19 deletions
+3 -3
View File
@@ -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,
})
}
-1
View File
@@ -385,7 +385,6 @@ type ListVersionsResult struct {
NextKeyMarker *string
NextVersionIdMarker *string
Prefix *string
RequestCharged types.RequestCharged
VersionIdMarker *string
Versions []types.ObjectVersion `xml:"Version"`
}
+9
View File
@@ -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,
+53 -10
View File
@@ -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...)
+10 -5
View File
@@ -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