mirror of
https://github.com/versity/versitygw.git
synced 2026-07-28 19:12:54 +00:00
fix: Fixed object versions listing with ListObjectVersions when versioning is not configured for the gateway
This commit is contained in:
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -385,7 +385,6 @@ type ListVersionsResult struct {
|
||||
NextKeyMarker *string
|
||||
NextVersionIdMarker *string
|
||||
Prefix *string
|
||||
RequestCharged types.RequestCharged
|
||||
VersionIdMarker *string
|
||||
Versions []types.ObjectVersion `xml:"Version"`
|
||||
}
|
||||
|
||||
@@ -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
@@ -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...)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user