From 7dc213e68ebfcb0d85b2793757858b0a12991374 Mon Sep 17 00:00:00 2001 From: niksis02 Date: Sat, 26 Jul 2025 00:12:09 +0400 Subject: [PATCH] fix: adds bucket region in ListBuckets result Fixes #1374 Hardcodes the gateway region for each bucket entry in `ListBuckets` result as bucket region. --- s3api/controllers/base.go | 2 ++ s3api/controllers/bucket-list.go | 17 +++++++++++++--- s3api/controllers/bucket-list_test.go | 12 ++++-------- s3response/s3response.go | 1 + tests/integration/tests.go | 28 ++++++++++++++++----------- tests/integration/utils.go | 5 +++++ 6 files changed, 43 insertions(+), 22 deletions(-) diff --git a/s3api/controllers/base.go b/s3api/controllers/base.go index eff9cb3d..53642672 100644 --- a/s3api/controllers/base.go +++ b/s3api/controllers/base.go @@ -51,6 +51,8 @@ const ( minPartNumber = 1 maxPartNumber = 10000 defaultMaxBuckets = int32(10000) + + defaultRegion = "us-east-1" ) var ( diff --git a/s3api/controllers/bucket-list.go b/s3api/controllers/bucket-list.go index 5cae8939..9da83bff 100644 --- a/s3api/controllers/bucket-list.go +++ b/s3api/controllers/bucket-list.go @@ -30,6 +30,10 @@ func (c S3ApiController) ListBuckets(ctx *fiber.Ctx) (*Response, error) { prefix := ctx.Query("prefix") maxBucketsStr := ctx.Query("max-buckets") acct := utils.ContextKeyAccount.Get(ctx).(auth.Account) + region, ok := utils.ContextKeyRegion.Get(ctx).(string) + if !ok { + region = defaultRegion + } maxBuckets := defaultMaxBuckets if maxBucketsStr != "" { @@ -51,8 +55,15 @@ func (c S3ApiController) ListBuckets(ctx *fiber.Ctx) (*Response, error) { ContinuationToken: cToken, Prefix: prefix, }) + if err != nil { + return &Response{}, err + } + + for i := range res.Buckets.Bucket { + res.Buckets.Bucket[i].BucketRegion = region + } + return &Response{ - Data: res, - MetaOpts: &MetaOptions{}, - }, err + Data: res, + }, nil } diff --git a/s3api/controllers/bucket-list_test.go b/s3api/controllers/bucket-list_test.go index 7f6bcc79..3406de2d 100644 --- a/s3api/controllers/bucket-list_test.go +++ b/s3api/controllers/bucket-list_test.go @@ -58,15 +58,12 @@ func TestS3ApiController_ListBuckets(t *testing.T) { name: "backend returns error", input: testInput{ locals: defaultLocals, - beRes: validRes, beErr: s3err.GetAPIError(s3err.ErrNoSuchBucket), + beRes: s3response.ListAllMyBucketsResult{}, }, output: testOutput{ - response: &Response{ - Data: validRes, - MetaOpts: &MetaOptions{}, - }, - err: s3err.GetAPIError(s3err.ErrNoSuchBucket), + response: &Response{}, + err: s3err.GetAPIError(s3err.ErrNoSuchBucket), }, }, { @@ -80,8 +77,7 @@ func TestS3ApiController_ListBuckets(t *testing.T) { }, output: testOutput{ response: &Response{ - Data: validRes, - MetaOpts: &MetaOptions{}, + Data: validRes, }, }, }, diff --git a/s3response/s3response.go b/s3response/s3response.go index 223e6f0b..67ca3e35 100644 --- a/s3response/s3response.go +++ b/s3response/s3response.go @@ -317,6 +317,7 @@ type ListAllMyBucketsResult struct { type ListAllMyBucketsEntry struct { Name string + BucketRegion string CreationDate time.Time } diff --git a/tests/integration/tests.go b/tests/integration/tests.go index 1380bbb5..2e83b28e 100644 --- a/tests/integration/tests.go +++ b/tests/integration/tests.go @@ -1701,7 +1701,7 @@ func HeadBucket_success(s *S3Conf) error { func ListBuckets_as_user(s *S3Conf) error { testName := "ListBuckets_as_user" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { - buckets := []types.Bucket{{Name: &bucket}} + buckets := []types.Bucket{{Name: &bucket, BucketRegion: &s.awsRegion}} for range 6 { bckt := getBucketName() @@ -1711,7 +1711,8 @@ func ListBuckets_as_user(s *S3Conf) error { } buckets = append(buckets, types.Bucket{ - Name: &bckt, + Name: &bckt, + BucketRegion: &s.awsRegion, }) } @@ -1762,7 +1763,7 @@ func ListBuckets_as_user(s *S3Conf) error { func ListBuckets_as_admin(s *S3Conf) error { testName := "ListBuckets_as_admin" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { - buckets := []types.Bucket{{Name: &bucket}} + buckets := []types.Bucket{{Name: &bucket, BucketRegion: &s.awsRegion}} for range 6 { bckt := getBucketName() @@ -1772,7 +1773,8 @@ func ListBuckets_as_admin(s *S3Conf) error { } buckets = append(buckets, types.Bucket{ - Name: &bckt, + Name: &bckt, + BucketRegion: &s.awsRegion, }) } @@ -1824,7 +1826,7 @@ func ListBuckets_with_prefix(s *S3Conf) error { testName := "ListBuckets_with_prefix" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { prefix := "my-prefix-" - allBuckets, prefixedBuckets := []types.Bucket{{Name: &bucket}}, []types.Bucket{} + allBuckets, prefixedBuckets := []types.Bucket{{Name: &bucket, BucketRegion: &s.awsRegion}}, []types.Bucket{} for i := range 5 { bckt := getBucketName() if i%2 == 0 { @@ -1837,12 +1839,14 @@ func ListBuckets_with_prefix(s *S3Conf) error { } allBuckets = append(allBuckets, types.Bucket{ - Name: &bckt, + Name: &bckt, + BucketRegion: &s.awsRegion, }) if i%2 == 0 { prefixedBuckets = append(prefixedBuckets, types.Bucket{ - Name: &bckt, + Name: &bckt, + BucketRegion: &s.awsRegion, }) } } @@ -1911,7 +1915,7 @@ func ListBuckets_invalid_max_buckets(s *S3Conf) error { func ListBuckets_truncated(s *S3Conf) error { testName := "ListBuckets_truncated" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { - buckets := []types.Bucket{{Name: &bucket}} + buckets := []types.Bucket{{Name: &bucket, BucketRegion: &s.awsRegion}} for range 5 { bckt := getBucketName() @@ -1921,7 +1925,8 @@ func ListBuckets_truncated(s *S3Conf) error { } buckets = append(buckets, types.Bucket{ - Name: &bckt, + Name: &bckt, + BucketRegion: &s.awsRegion, }) } @@ -2002,7 +2007,7 @@ func ListBuckets_empty_success(s *S3Conf) error { func ListBuckets_success(s *S3Conf) error { testName := "ListBuckets_success" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { - buckets := []types.Bucket{{Name: &bucket}} + buckets := []types.Bucket{{Name: &bucket, BucketRegion: &s.awsRegion}} for range 5 { bckt := getBucketName() @@ -2012,7 +2017,8 @@ func ListBuckets_success(s *S3Conf) error { } buckets = append(buckets, types.Bucket{ - Name: &bckt, + Name: &bckt, + BucketRegion: &s.awsRegion, }) } diff --git a/tests/integration/utils.go b/tests/integration/utils.go index 33a9bb17..464cee76 100644 --- a/tests/integration/utils.go +++ b/tests/integration/utils.go @@ -728,6 +728,11 @@ func compareBuckets(list1 []types.Bucket, list2 []types.Bucket) bool { for i, elem := range list1 { if *elem.Name != *list2[i].Name { + fmt.Printf("bucket names are not equal: %s != %s\n", *elem.Name, *list2[i].Name) + return false + } + if *elem.BucketRegion != *list2[i].BucketRegion { + fmt.Printf("bucket regions are not equal: %s != %s\n", *elem.BucketRegion, *list2[i].BucketRegion) return false } }