github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/gateway/operations/putbucket.go (about) 1 package operations 2 3 import ( 4 "net/http" 5 6 gatewayerrors "github.com/treeverse/lakefs/pkg/gateway/errors" 7 "github.com/treeverse/lakefs/pkg/permissions" 8 ) 9 10 // PutBucket handles S3 Create Bucket operations. It does *not* actually 11 // create new repos (there is not enough information in the S3 request to 12 // create a new repo), but *does* detect whether the repo already exists. 13 type PutBucket struct{} 14 15 func (controller *PutBucket) RequiredPermissions(_ *http.Request, repoID string) (permissions.Node, error) { 16 return permissions.Node{ 17 Permission: permissions.Permission{ 18 // Mimic S3, which requires s3:CreateBucket to call 19 // create-bucket, even if we only want to receive 20 // 409. 21 Action: permissions.CreateRepositoryAction, 22 Resource: permissions.RepoArn(repoID), 23 }, 24 }, nil 25 } 26 27 func (controller *PutBucket) Handle(w http.ResponseWriter, req *http.Request, o *RepoOperation) { 28 if o.HandleUnsupported(w, req, "cors", "metrics", "website", "logging", "accelerate", 29 "requestPayment", "acl", "publicAccessBlock", "ownershipControls", "intelligent-tiering", "analytics", 30 "lifecycle", "replication", "encryption", "policy", "object-lock", "tagging", "versioning") { 31 return 32 } 33 34 o.Incr("put_repo", o.Principal, o.Repository.Name, "") 35 o.EncodeError(w, req, nil, gatewayerrors.ErrBucketAlreadyExists.ToAPIErr()) 36 }