diff --git a/api/errors/errors.go b/api/errors/errors.go index 775add32..7ce7c5fe 100644 --- a/api/errors/errors.go +++ b/api/errors/errors.go @@ -1822,6 +1822,10 @@ func TransformToS3Error(err error) error { return GetAPIError(ErrGatewayTimeout) } + if errors.Is(err, frostfs.ErrGlobalDomainIsAlreadyTaken) { + return GetAPIError(ErrBucketAlreadyExists) + } + return GetAPIError(ErrInternalError) } diff --git a/api/layer/frostfs/frostfs.go b/api/layer/frostfs/frostfs.go index 7f4a568c..ba013504 100644 --- a/api/layer/frostfs/frostfs.go +++ b/api/layer/frostfs/frostfs.go @@ -237,6 +237,9 @@ var ( // ErrGatewayTimeout is returned from FrostFS in case of timeout, deadline exceeded etc. ErrGatewayTimeout = errors.New("gateway timeout") + + // ErrGlobalDomainIsAlreadyTaken is returned from FrostFS in case of global domain is already taken. + ErrGlobalDomainIsAlreadyTaken = errors.New("global domain is already taken") ) // FrostFS represents virtual connection to FrostFS network. diff --git a/internal/frostfs/frostfs.go b/internal/frostfs/frostfs.go index 38b8be7a..7b4fba9c 100644 --- a/internal/frostfs/frostfs.go +++ b/internal/frostfs/frostfs.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "strconv" + "strings" "time" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/layer/frostfs" @@ -483,6 +484,10 @@ func handleObjectError(msg string, err error) error { return fmt.Errorf("%s: %w: %s", msg, frostfs.ErrGatewayTimeout, err.Error()) } + if strings.Contains(err.Error(), "global domain is already taken") { + return fmt.Errorf("%s: %w: %s", msg, frostfs.ErrGlobalDomainIsAlreadyTaken, err.Error()) + } + return fmt.Errorf("%s: %w", msg, err) }