errdefs: convert containerd errors to the correct status code
In situations where the containerd error is consumed directly
and not received over gRPC, errors were not translated.
This patch converts containerd errors to the correct HTTP
status code.
@@ -4,6 +4,7 @@ import (
"fmt"
"net/http"
+ containerderrors "github.com/containerd/containerd/errdefs"
"github.com/docker/distribution/registry/api/errcode"
"github.com/sirupsen/logrus"
"google.golang.org/grpc/codes"
@@ -47,6 +48,10 @@ func GetHTTPErrorStatusCode(err error) int {
if statusCode != http.StatusInternalServerError {
return statusCode
}
+ statusCode = statusCodeFromContainerdError(err)
+ if statusCode != http.StatusInternalServerError {
+ return statusCode
+ }
statusCode = statusCodeFromDistributionError(err)
if statusCode != http.StatusInternalServerError {
return statusCode
@@ -170,3 +175,24 @@ func statusCodeFromDistributionError(err error) int {
}
return http.StatusInternalServerError
}
+
+// statusCodeFromContainerdError returns status code for containerd errors when
+// consumed directory (not through gRPC)
+func statusCodeFromContainerdError(err error) int {
+ switch {
+ case containerderrors.IsInvalidArgument(err):
+ return http.StatusBadRequest
+ case containerderrors.IsNotFound(err):
+ return http.StatusNotFound
+ case containerderrors.IsAlreadyExists(err):
+ return http.StatusConflict
+ case containerderrors.IsFailedPrecondition(err):
+ return http.StatusPreconditionFailed
+ case containerderrors.IsUnavailable(err):
+ return http.StatusServiceUnavailable
+ case containerderrors.IsNotImplemented(err):
+ return http.StatusNotImplemented
+ default:
+ return http.StatusInternalServerError
+ }
+}
