[#187] Add handling quota limit reached error

The Access Denied status may be received
from APE due to exceeding the quota. In
this situation, you need to return the
appropriate status code.

Signed-off-by: Roman Loginov <r.loginov@yadro.com>
This commit is contained in:
Roman Loginov 2024-12-25 16:09:03 +03:00
parent ce04b0836a
commit ed69ccfd5d
4 changed files with 19 additions and 0 deletions

View file

@ -139,6 +139,8 @@ var (
ErrAccessDenied = errors.New("access denied") ErrAccessDenied = errors.New("access denied")
// ErrGatewayTimeout is returned from FrostFS in case of timeout, deadline exceeded etc. // ErrGatewayTimeout is returned from FrostFS in case of timeout, deadline exceeded etc.
ErrGatewayTimeout = errors.New("gateway timeout") ErrGatewayTimeout = errors.New("gateway timeout")
// ErrQuotaLimitReached is returned from FrostFS in case of quota exceeded.
ErrQuotaLimitReached = errors.New("quota limit reached")
) )
// FrostFS represents virtual connection to FrostFS network. // FrostFS represents virtual connection to FrostFS network.

View file

@ -106,6 +106,9 @@ func formErrorResponse(message string, err error) (int, string) {
case errors.Is(err, ErrGatewayTimeout): case errors.Is(err, ErrGatewayTimeout):
statusCode = fasthttp.StatusBadGateway statusCode = fasthttp.StatusBadGateway
errMsg = err.Error() errMsg = err.Error()
case errors.Is(err, ErrQuotaLimitReached):
statusCode = fasthttp.StatusConflict
errMsg = err.Error()
case client.IsErrObjectNotFound(err) || client.IsErrContainerNotFound(err): case client.IsErrObjectNotFound(err) || client.IsErrContainerNotFound(err):
statusCode = fasthttp.StatusNotFound statusCode = fasthttp.StatusNotFound
errMsg = "Not Found" errMsg = "Not Found"

View file

@ -205,6 +205,9 @@ func handleObjectError(msg string, err error) error {
} }
if reason, ok := IsErrObjectAccessDenied(err); ok { if reason, ok := IsErrObjectAccessDenied(err); ok {
if strings.Contains(reason, "limit reached") {
return fmt.Errorf("%s: %w: %s", msg, handler.ErrQuotaLimitReached, reason)
}
return fmt.Errorf("%s: %w: %s", msg, handler.ErrAccessDenied, reason) return fmt.Errorf("%s: %w: %s", msg, handler.ErrAccessDenied, reason)
} }

View file

@ -33,6 +33,17 @@ func TestHandleObjectError(t *testing.T) {
require.Contains(t, err.Error(), msg) require.Contains(t, err.Error(), msg)
}) })
t.Run("access denied - quota reached", func(t *testing.T) {
reason := "Quota limit reached"
inputErr := new(apistatus.ObjectAccessDenied)
inputErr.WriteReason(reason)
err := handleObjectError(msg, inputErr)
require.ErrorIs(t, err, handler.ErrQuotaLimitReached)
require.Contains(t, err.Error(), reason)
require.Contains(t, err.Error(), msg)
})
t.Run("simple timeout", func(t *testing.T) { t.Run("simple timeout", func(t *testing.T) {
inputErr := errors.New("timeout") inputErr := errors.New("timeout")