diff --git a/cmd/neofs-rest-gw/config.go b/cmd/neofs-rest-gw/config.go index aba4b6e..734f6e8 100644 --- a/cmd/neofs-rest-gw/config.go +++ b/cmd/neofs-rest-gw/config.go @@ -596,6 +596,7 @@ func newNeofsAPI(ctx context.Context, logger *zap.Logger, v *viper.Viper) (*hand } apiPrm.DefaultTimestamp = v.GetBool(cfgPoolDefaultTimestamp) + apiPrm.WaiterOperationTimeout = time.Duration(uint64(ni.MsPerBlock())*4) * time.Millisecond return handlers.NewAPI(&apiPrm) } diff --git a/cmd/neofs-rest-gw/integration_test.go b/cmd/neofs-rest-gw/integration_test.go index 27154f6..e4aaaf9 100644 --- a/cmd/neofs-rest-gw/integration_test.go +++ b/cmd/neofs-rest-gw/integration_test.go @@ -1411,7 +1411,7 @@ func restContainerEACLPut(ctx context.Context, t *testing.T, clientPool *pool.Po query := make(url.Values) query.Add(walletConnectQuery, strconv.FormatBool(useWalletConnect)) - doSetEACLRequest(ctx, t, httpClient, cnrID, query, bearerToken, invalidBody, http.StatusBadRequest, nil) + doSetEACLRequest(ctx, t, httpClient, cnrID, query, bearerToken, invalidBody, http.StatusInternalServerError, nil) resp := &apiserver.SuccessResponse{} doSetEACLRequest(ctx, t, httpClient, cnrID, query, bearerToken, body, http.StatusOK, resp) @@ -1614,7 +1614,7 @@ func restContainerPutInvalid(ctx context.Context, t *testing.T) { prepareCommonHeaders(request.Header, bearerToken) resp := &apiserver.ErrorResponse{} - doRequest(t, httpClient, request, http.StatusBadRequest, resp) + doRequest(t, httpClient, request, http.StatusInternalServerError, resp) require.Equal(t, uint32(0), resp.Code) require.Equal(t, apiserver.GW, resp.Type) } @@ -1650,7 +1650,7 @@ func restContainerPut(ctx context.Context, t *testing.T, clientPool *pool.Pool) require.NoError(t, err) prepareCommonHeaders(request.Header, bearerToken) - doRequest(t, httpClient, request, http.StatusBadRequest, nil) + doRequest(t, httpClient, request, http.StatusInternalServerError, nil) // create container with name in local scope containerPutInfo := &apiserver.ContainerPutInfo{ diff --git a/handlers/api.go b/handlers/api.go index dea19ea..a4c11e0 100644 --- a/handlers/api.go +++ b/handlers/api.go @@ -34,6 +34,7 @@ type PrmAPI struct { PrometheusService *metrics.Service PprofService *metrics.Service ServiceShutdownTimeout time.Duration + WaiterOperationTimeout time.Duration } type BearerToken struct { @@ -83,6 +84,7 @@ func NewAPI(prm *PrmAPI) (*RestAPI, error) { gateMetric: prm.GateMetric, serviceShutdownTimeout: prm.ServiceShutdownTimeout, networkInfoGetter: cache.NewNetworkInfoCache(prm.Pool), + waiterOperationTimeout: prm.WaiterOperationTimeout, }, nil } @@ -150,6 +152,7 @@ type RestAPI struct { pprofService *metrics.Service serviceShutdownTimeout time.Duration networkInfoGetter networkInfoGetter + waiterOperationTimeout time.Duration } func (a *RestAPI) StartCallback() { diff --git a/handlers/apiserver/rest-server.gen.go b/handlers/apiserver/rest-server.gen.go index d5335c5..c03c9fe 100644 --- a/handlers/apiserver/rest-server.gen.go +++ b/handlers/apiserver/rest-server.gen.go @@ -2831,46 +2831,47 @@ var swaggerSpec = []string{ "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/handlers/containers.go b/handlers/containers.go index 72b6322..f0f19d7 100644 --- a/handlers/containers.go +++ b/handlers/containers.go @@ -64,10 +64,13 @@ func (a *RestAPI) PutContainer(ctx echo.Context, params apiserver.PutContainerPa return ctx.JSON(http.StatusBadRequest, resp) } - cnrID, err := createContainer(ctx.Request().Context(), a.pool, stoken, body, params, a.signer, a.networkInfoGetter) + wCtx, cancel := context.WithTimeout(ctx.Request().Context(), a.waiterOperationTimeout) + defer cancel() + + cnrID, err := createContainer(wCtx, a.pool, stoken, body, params, a.signer, a.networkInfoGetter) if err != nil { resp := a.logAndGetErrorResponse("create container", err) - return ctx.JSON(http.StatusBadRequest, resp) + return ctx.JSON(getResponseCodeFromStatus(err), resp) } resp := apiserver.PutContainerOK{ @@ -136,9 +139,12 @@ func (a *RestAPI) PutContainerEACL(ctx echo.Context, containerID apiserver.Conta return ctx.JSON(http.StatusBadRequest, resp) } - if err = setContainerEACL(ctx.Request().Context(), a.pool, cnrID, stoken, body, a.signer); err != nil { + wCtx, cancel := context.WithTimeout(ctx.Request().Context(), a.waiterOperationTimeout) + defer cancel() + + if err = setContainerEACL(wCtx, a.pool, cnrID, stoken, body, a.signer); err != nil { resp := a.logAndGetErrorResponse("failed set container eacl", err) - return ctx.JSON(http.StatusBadRequest, resp) + return ctx.JSON(getResponseCodeFromStatus(err), resp) } ctx.Response().Header().Set(accessControlAllowOriginHeader, "*") @@ -255,9 +261,12 @@ func (a *RestAPI) DeleteContainer(ctx echo.Context, containerID apiserver.Contai prm.WithinSession(stoken) wait := waiter.NewContainerDeleteWaiter(a.pool, waiter.DefaultPollInterval) - if err = wait.ContainerDelete(ctx.Request().Context(), cnrID, a.signer, prm); err != nil { + wCtx, cancel := context.WithTimeout(ctx.Request().Context(), a.waiterOperationTimeout) + defer cancel() + + if err = wait.ContainerDelete(wCtx, cnrID, a.signer, prm); err != nil { resp := a.logAndGetErrorResponse("delete container", err, zap.String("container", containerID)) - return ctx.JSON(http.StatusBadRequest, resp) + return ctx.JSON(getResponseCodeFromStatus(err), resp) } ctx.Response().Header().Set(accessControlAllowOriginHeader, "*") diff --git a/handlers/conv.go b/handlers/conv.go new file mode 100644 index 0000000..7caa17a --- /dev/null +++ b/handlers/conv.go @@ -0,0 +1,53 @@ +package handlers + +import ( + "context" + "errors" + "net/http" + + apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status" +) + +func getResponseCodeFromStatus(err error) int { + if err == nil { + return http.StatusOK + } + + switch { + case errors.Is(err, context.Canceled): + return http.StatusGatewayTimeout + case errors.Is(err, context.DeadlineExceeded): + return http.StatusGatewayTimeout + case errors.Is(err, apistatus.ErrEACLNotFound): + return http.StatusNotFound + case errors.Is(err, apistatus.ErrContainerNotFound): + return http.StatusNotFound + case errors.Is(err, apistatus.ErrSessionTokenNotFound): + return http.StatusNotFound + case errors.Is(err, apistatus.ErrSessionTokenExpired): + return http.StatusForbidden + case errors.Is(err, apistatus.ErrObjectLocked): + return http.StatusConflict + case errors.Is(err, apistatus.ErrObjectAlreadyRemoved): + return http.StatusGone + case errors.Is(err, apistatus.ErrLockNonRegularObject): + return http.StatusForbidden + case errors.Is(err, apistatus.ErrObjectAccessDenied): + return http.StatusForbidden + case errors.Is(err, apistatus.ErrObjectNotFound): + return http.StatusNotFound + case errors.Is(err, apistatus.ErrObjectOutOfRange): + return http.StatusRequestedRangeNotSatisfiable + case errors.Is(err, apistatus.ErrServerInternal): + return http.StatusBadGateway + case errors.Is(err, apistatus.ErrWrongMagicNumber): + return http.StatusBadGateway + case errors.Is(err, apistatus.ErrSignatureVerification): + return http.StatusBadGateway + case errors.Is(err, apistatus.ErrNodeUnderMaintenance): + return http.StatusBadGateway + + default: + return http.StatusInternalServerError + } +} diff --git a/spec/rest.yaml b/spec/rest.yaml index de6ec5f..da0d58f 100644 --- a/spec/rest.yaml +++ b/spec/rest.yaml @@ -491,6 +491,30 @@ paths: '*/*': schema: $ref: '#/components/schemas/ErrorResponse' + "403": + description: Access denied + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorResponse' + "404": + description: Not found. + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorResponse' + "502": + description: Bad gateway. + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorResponse' + "504": + description: Gateway timeout + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: container options: operationId: optionsContainersPutList @@ -558,6 +582,30 @@ paths: '*/*': schema: $ref: '#/components/schemas/ErrorResponse' + "403": + description: Access denied + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorResponse' + "404": + description: Not found. + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorResponse' + "502": + description: Bad gateway. + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorResponse' + "504": + description: Gateway timeout + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorResponse' options: operationId: optionsContainersGetDelete parameters: @@ -633,6 +681,30 @@ paths: '*/*': schema: $ref: '#/components/schemas/ErrorResponse' + "403": + description: Access denied + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorResponse' + "404": + description: Not found. + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorResponse' + "502": + description: Bad gateway. + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorResponse' + "504": + description: Gateway timeout + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: eacl options: operationId: optionsContainersEACL