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  }