Merge pull request #1876 from versity/sis/create-bucket-response

feat: adds `Location`, `x-amz-bucket-arn` response headers in CreateBucket
This commit is contained in:
Ben McClelland
2026-02-23 12:34:05 -08:00
committed by GitHub
5 changed files with 45 additions and 25 deletions
+13 -1
View File
@@ -632,9 +632,21 @@ func (c S3ApiController) CreateBucket(ctx *fiber.Ctx) (*Response, error) {
Tags: body.TagSet,
},
}, updAcl)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
BucketOwner: bucketOwner.Access,
},
}, err
}
return &Response{
MetaOpts: &MetaOptions{
BucketOwner: bucketOwner.Access,
},
}, err
Headers: map[string]*string{
"Location": utils.GetStringPtr("/" + bucket),
"x-amz-bucket-arn": utils.GetStringPtr(auth.ResourceArnPrefix + bucket),
},
}, nil
}
+5
View File
@@ -888,12 +888,17 @@ func TestS3ApiController_CreateBucket(t *testing.T) {
locals: map[utils.ContextKey]any{
utils.ContextKeyAccount: adminAcc,
},
bucket: "my-bucket",
},
output: testOutput{
response: &Response{
MetaOpts: &MetaOptions{
BucketOwner: adminAcc.Access,
},
Headers: map[string]*string{
"Location": utils.GetStringPtr("/my-bucket"),
"x-amz-bucket-arn": utils.GetStringPtr("arn:aws:s3:::my-bucket"),
},
},
},
},
+25
View File
@@ -641,3 +641,28 @@ func CreateBucket_invalid_canned_acl(s *S3Conf) error {
return checkSdkApiErr(err, "InvalidArgument")
})
}
func CreateBucket_success(s *S3Conf) error {
testName := "CreateBucket_success"
return actionHandlerNoSetup(s, testName, func(s3client *s3.Client, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
res, err := s3client.CreateBucket(ctx, &s3.CreateBucketInput{
Bucket: &bucket,
})
cancel()
if err != nil {
return err
}
expectedLocation := "/" + bucket
if getString(res.Location) != expectedLocation {
return fmt.Errorf("expected the bucket Location to be %s, instead got %s", expectedLocation, getString(res.Location))
}
expectedArn := "arn:aws:s3:::" + bucket
if getString(res.BucketArn) != expectedArn {
return fmt.Errorf("expected the bucket arn to be %s, instead got %s", expectedArn, getString(res.BucketArn))
}
return teardown(s, bucket)
})
}
-22
View File
@@ -24,28 +24,6 @@ import (
"github.com/versity/versitygw/s3err"
)
func CreateDeleteBucket_success(s *S3Conf) error {
testName := "CreateBucket_success"
runF(testName)
bucket := getBucketName()
err := setup(s, bucket)
if err != nil {
failF("%v: %v", testName, err)
return fmt.Errorf("%v: %w", testName, err)
}
err = teardown(s, bucket)
if err != nil {
failF("%v: %v", testName, err)
return fmt.Errorf("%v: %w", testName, err)
}
passF(testName)
return nil
}
func DeleteBucket_non_existing_bucket(s *S3Conf) error {
testName := "DeleteBucket_non_existing_bucket"
runF(testName)
+2 -2
View File
@@ -81,7 +81,7 @@ func TestCreateBucket(ts *TestState) {
ts.Run(CreateBucket_non_default_acl)
ts.Run(CreateBucket_private_canned_acl)
ts.Run(CreateBucket_private_canned_acl_bucket_owner_enforced_ownership)
ts.Run(CreateDeleteBucket_success)
ts.Run(CreateBucket_success)
ts.Run(CreateBucket_default_object_lock)
ts.Run(CreateBucket_invalid_location_constraint)
ts.Run(CreateBucket_long_tags)
@@ -1246,7 +1246,7 @@ func GetIntTests() IntTests {
"CreateBucket_invalid_ownership": CreateBucket_invalid_ownership,
"CreateBucket_ownership_with_acl": CreateBucket_ownership_with_acl,
"CreateBucket_as_user": CreateBucket_as_user,
"CreateDeleteBucket_success": CreateDeleteBucket_success,
"CreateBucket_success": CreateBucket_success,
"CreateBucket_default_acl": CreateBucket_default_acl,
"CreateBucket_non_default_acl": CreateBucket_non_default_acl,
"CreateBucket_private_canned_acl": CreateBucket_private_canned_acl,