...

Source file src/github.com/Microsoft/hcsshim/internal/oc/errors.go

Documentation: github.com/Microsoft/hcsshim/internal/oc

     1  package oc
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  	"net"
     7  	"os"
     8  
     9  	"github.com/containerd/containerd/errdefs"
    10  	"google.golang.org/grpc/codes"
    11  	"google.golang.org/grpc/status"
    12  )
    13  
    14  // todo: break import cycle with "internal/hcs/errors.go" and reference errors defined there
    15  // todo: add errors defined in "internal/guest/gcserror" (Hresult does not implement error)
    16  
    17  func toStatusCode(err error) codes.Code {
    18  	// checks if err implements GRPCStatus() *"google.golang.org/grpc/status".Status,
    19  	// wraps an error defined in "github.com/containerd/containerd/errdefs", or is a
    20  	// context timeout or cancelled error
    21  	if s, ok := status.FromError(errdefs.ToGRPC(err)); ok {
    22  		return s.Code()
    23  	}
    24  
    25  	switch {
    26  	// case isAny(err):
    27  	// 	return codes.Cancelled
    28  	case isAny(err, os.ErrInvalid):
    29  		return codes.InvalidArgument
    30  	case isAny(err, os.ErrDeadlineExceeded):
    31  		return codes.DeadlineExceeded
    32  	case isAny(err, os.ErrNotExist):
    33  		return codes.NotFound
    34  	case isAny(err, os.ErrExist):
    35  		return codes.AlreadyExists
    36  	case isAny(err, os.ErrPermission):
    37  		return codes.PermissionDenied
    38  	// case isAny(err):
    39  	// 	return codes.ResourceExhausted
    40  	case isAny(err, os.ErrClosed, net.ErrClosed, io.ErrClosedPipe, io.ErrShortBuffer):
    41  		return codes.FailedPrecondition
    42  	// case isAny(err):
    43  	// 	return codes.Aborted
    44  	// case isAny(err):
    45  	// 	return codes.OutOfRange
    46  	// case isAny(err):
    47  	// 	return codes.Unimplemented
    48  	case isAny(err, io.ErrNoProgress):
    49  		return codes.Internal
    50  	// case isAny(err):
    51  	// 	return codes.Unavailable
    52  	case isAny(err, io.ErrShortWrite, io.ErrUnexpectedEOF):
    53  		return codes.DataLoss
    54  	// case isAny(err):
    55  	// 	return codes.Unauthenticated
    56  	default:
    57  		return codes.Unknown
    58  	}
    59  }
    60  
    61  // isAny returns true if errors.Is is true for any of the provided errors, errs.
    62  func isAny(err error, errs ...error) bool {
    63  	for _, e := range errs {
    64  		if errors.Is(err, e) {
    65  			return true
    66  		}
    67  	}
    68  	return false
    69  }
    70  

View as plain text