github.com/microsoft/moc@v0.17.1/pkg/errors/errors.go (about)

     1  // Copyright (c) Microsoft Corporation.
     2  // Licensed under the Apache v2.0 license.
     3  package errors
     4  
     5  import (
     6  	"errors"
     7  	"os"
     8  	"strings"
     9  
    10  	perrors "github.com/pkg/errors"
    11  	"google.golang.org/grpc/codes"
    12  	status "google.golang.org/grpc/status"
    13  )
    14  
    15  var (
    16  	NotFound                    error = errors.New("Not Found")
    17  	Degraded                    error = errors.New("Degraded")
    18  	InvalidConfiguration        error = errors.New("Invalid Configuration")
    19  	InvalidInput                error = errors.New("Invalid Input")
    20  	InvalidType                 error = errors.New("Invalid Type")
    21  	NotSupported                error = errors.New("Not Supported")
    22  	AlreadyExists               error = errors.New("Already Exists")
    23  	InUse                       error = errors.New("In Use")
    24  	Duplicates                  error = errors.New("Duplicates")
    25  	InvalidFilter               error = errors.New("Invalid Filter")
    26  	Failed                      error = errors.New("Failed")
    27  	InvalidGroup                error = errors.New("InvalidGroup")
    28  	InvalidVersion              error = errors.New("InvalidVersion")
    29  	OldVersion                  error = errors.New("OldVersion")
    30  	OutOfCapacity               error = errors.New("OutOfCapacity")
    31  	OutOfNodeCapacity           error = errors.New("OutOfNodeCapacity")
    32  	OutOfMemory                 error = errors.New("OutOfMemory")
    33  	UpdateFailed                error = errors.New("Update Failed")
    34  	NotInitialized              error = errors.New("Not Initialized")
    35  	NotImplemented              error = errors.New("Not Implemented")
    36  	OutOfRange                  error = errors.New("Out of range")
    37  	AlreadySet                  error = errors.New("Already Set")
    38  	NotSet                      error = errors.New("Not Set")
    39  	InconsistentState           error = errors.New("Inconsistent state")
    40  	PendingState                error = errors.New("Pending state")
    41  	WrongHost                   error = errors.New("Wrong host")
    42  	PoolFull                    error = errors.New("The pool is full")
    43  	NoActionTaken               error = errors.New("No Action Taken")
    44  	Expired                     error = errors.New("Expired")
    45  	Revoked                     error = errors.New("Revoked")
    46  	Timeout                     error = errors.New("Timedout")
    47  	RunCommandFailed            error = errors.New("Run Command Failed")
    48  	InvalidToken                error = errors.New("InvalidToken")
    49  	Unknown                     error = errors.New("Unknown Reason")
    50  	DeleteFailed                error = errors.New("Delete Failed")
    51  	DeletePending               error = errors.New("Delete Pending")
    52  	FileNotFound                error = errors.New("The system cannot find the file specified")
    53  	PathNotFound                error = errors.New("The system cannot find the path specified")
    54  	NotEnoughSpace              error = errors.New("There is not enough space on the disk")
    55  	AccessDenied                error = errors.New("Access is denied")
    56  	BlobNotFound                error = errors.New("BlobNotFound")
    57  	GenericFailure              error = errors.New("Generic failure")
    58  	NoAuthenticationInformation error = errors.New("NoAuthenticationInformation")
    59  	MeasurementUnitError        error = errors.New("byte quantity must be a positive integer with a unit of measurement like")
    60  	QuotaViolation              error = errors.New("Quota violation")
    61  	IPOutOfRange                error = errors.New("IP is out of range")
    62  )
    63  
    64  func GetErrorCode(err error) string {
    65  	if IsNotFound(err) || IsFileNotFound(err) || IsPathNotFound(err) || IsBlobNotFound(err) {
    66  		return "NotFound"
    67  	} else if IsDegraded(err) {
    68  		return "Degraded"
    69  	} else if IsInvalidConfiguration(err) {
    70  		return "InvalidConfiguration"
    71  	} else if IsInvalidInput(err) {
    72  		return "InvalidInput"
    73  	} else if IsNotSupported(err) {
    74  		return "NotSupported"
    75  	} else if IsAlreadyExists(err) {
    76  		return "AlreadyExists"
    77  	} else if IsInUse(err) {
    78  		return "InUse"
    79  	} else if IsDuplicates(err) {
    80  		return "Duplicates"
    81  	} else if IsInvalidFilter(err) {
    82  		return "InvalidFilter"
    83  	} else if IsFailed(err) {
    84  		return "Failed"
    85  	} else if IsInvalidGroup(err) {
    86  		return "InvalidGroup"
    87  	} else if IsInvalidType(err) {
    88  		return "InvalidType"
    89  	} else if IsInvalidVersion(err) {
    90  		return "InvalidVersion"
    91  	} else if IsOldVersion(err) {
    92  		return "OldVersion"
    93  	} else if IsOutOfCapacity(err) || IsNotEnoughSpace(err) {
    94  		return "OutOfCapacity"
    95  	} else if IsOutOfNodeCapacity(err) {
    96  		return "OutOfNodeCapacity"
    97  	} else if IsOutOfMemory(err) {
    98  		return "OutOfMemory"
    99  	} else if IsUpdateFailed(err) {
   100  		return "UpdateFailed"
   101  	} else if IsNotInitialized(err) {
   102  		return "NotInitialized"
   103  	} else if IsNotImplemented(err) {
   104  		return "NotImplemented"
   105  	} else if IsOutOfRange(err) {
   106  		return "OutOfRange"
   107  	} else if IsAlreadySet(err) {
   108  		return "AlreadySet"
   109  	} else if IsNotSet(err) {
   110  		return "NotSet"
   111  	} else if IsInconsistentState(err) {
   112  		return "InconsistentState"
   113  	} else if IsPendingState(err) {
   114  		return "PendingState"
   115  	} else if IsWrongHost(err) {
   116  		return "WrongHost"
   117  	} else if IsPoolFull(err) {
   118  		return "PoolFull"
   119  	} else if IsNoActionTaken(err) {
   120  		return "NoActionTaken"
   121  	} else if IsExpired(err) {
   122  		return "Expired"
   123  	} else if IsRevoked(err) {
   124  		return "Revoked"
   125  	} else if IsTimeout(err) {
   126  		return "Timeout"
   127  	} else if IsInvalidToken(err) {
   128  		return "InvalidToken"
   129  	} else if IsUnknown(err) || IsGenericFailure(err) {
   130  		return "Unknown"
   131  	} else if IsDeleteFailed(err) {
   132  		return "Delete Failed"
   133  	} else if IsDeletePending(err) {
   134  		return "Delete Pending"
   135  	} else if IsRunCommandFailed(err) {
   136  		return "RunCommandFailed"
   137  	} else if IsAccessDenied(err) {
   138  		return "AccessDenied"
   139  	} else if IsNoAuthenticationInformation(err) {
   140  		return "NoAuthenticationInformation"
   141  	} else if IsQuotaViolation(err) {
   142  		return "QuotaViolation"
   143  	} else if IsMeasurementUnitError(err) {
   144  		return "MeasurementUnitError"
   145  	} else if IsIPOutOfRange(err) {
   146  		return "IPOutOfRange"
   147  	}
   148  
   149  	// We dont know the type of error.
   150  	// Returning the base error string
   151  	return err.Error()
   152  }
   153  
   154  func Wrap(cause error, message string) error {
   155  	return perrors.Wrap(cause, message)
   156  }
   157  
   158  func Wrapf(err error, format string, args ...interface{}) error {
   159  	return perrors.Wrapf(err, format, args...)
   160  }
   161  
   162  func GetGRPCErrorCode(err error) codes.Code {
   163  	if derr, ok := status.FromError(err); ok {
   164  		return derr.Code()
   165  	}
   166  	return codes.Unknown
   167  }
   168  
   169  func checkGRPCErrorCode(err error, code codes.Code) bool {
   170  	if derr, ok := status.FromError(err); ok {
   171  		return derr.Code() == code
   172  	}
   173  	return status.Code(err) == code
   174  }
   175  
   176  func IsGRPCUnknown(err error) bool {
   177  	return checkGRPCErrorCode(err, codes.Unknown)
   178  }
   179  
   180  func IsGRPCNotFound(err error) bool {
   181  	return checkGRPCErrorCode(err, codes.NotFound)
   182  }
   183  
   184  func IsGRPCDeadlineExceeded(err error) bool {
   185  	return checkGRPCErrorCode(err, codes.DeadlineExceeded)
   186  }
   187  
   188  func IsGRPCAlreadyExist(err error) bool {
   189  	return checkGRPCErrorCode(err, codes.AlreadyExists)
   190  }
   191  
   192  func IsGRPCUnavailable(err error) bool {
   193  	return checkGRPCErrorCode(err, codes.Unavailable)
   194  }
   195  
   196  func IsGRPCAborted(err error) bool {
   197  	return checkGRPCErrorCode(err, codes.Aborted)
   198  }
   199  
   200  func GetGRPCError(err error) error {
   201  	if err == nil {
   202  		return err
   203  	}
   204  	if IsNotFound(err) {
   205  		return status.Errorf(codes.NotFound, err.Error())
   206  	}
   207  	if IsAlreadyExists(err) {
   208  		return status.Errorf(codes.AlreadyExists, err.Error())
   209  	}
   210  	return err
   211  }
   212  
   213  func IsOutOfMemory(err error) bool {
   214  	return checkError(err, OutOfMemory)
   215  }
   216  func IsInvalidVersion(err error) bool {
   217  	return checkError(err, InvalidVersion)
   218  }
   219  func IsNotFound(err error) bool {
   220  	return checkError(err, NotFound)
   221  }
   222  func IsDegraded(err error) bool {
   223  	return checkError(err, Degraded)
   224  }
   225  func IsNotSupported(err error) bool {
   226  	return checkError(err, NotSupported)
   227  }
   228  func IsInvalidConfiguration(err error) bool {
   229  	return checkError(err, InvalidConfiguration)
   230  }
   231  func IsInvalidInput(err error) bool {
   232  	return checkError(err, InvalidInput)
   233  }
   234  func IsAlreadyExists(err error) bool {
   235  	return checkError(err, AlreadyExists)
   236  }
   237  func IsInvalidGroup(err error) bool {
   238  	return checkError(err, InvalidGroup)
   239  }
   240  func IsInvalidType(err error) bool {
   241  	return checkError(err, InvalidType)
   242  }
   243  func IsNotInitialized(err error) bool {
   244  	return checkError(err, NotInitialized)
   245  }
   246  func IsOutOfRange(err error) bool {
   247  	return checkError(err, OutOfRange)
   248  }
   249  func IsOutOfCapacity(err error) bool {
   250  	return checkError(err, OutOfCapacity)
   251  }
   252  func IsOutOfNodeCapacity(err error) bool {
   253  	return checkError(err, OutOfNodeCapacity)
   254  }
   255  func IsAlreadySet(err error) bool {
   256  	return checkError(err, AlreadySet)
   257  }
   258  func IsNotSet(err error) bool {
   259  	return checkError(err, NotSet)
   260  }
   261  func IsInconsistentState(err error) bool {
   262  	return checkError(err, InconsistentState)
   263  }
   264  func IsPendingState(err error) bool {
   265  	return checkError(err, PendingState)
   266  }
   267  func IsInUse(err error) bool {
   268  	return checkError(err, InUse)
   269  }
   270  func IsDuplicates(err error) bool {
   271  	return checkError(err, Duplicates)
   272  }
   273  func IsInvalidFilter(err error) bool {
   274  	return checkError(err, InvalidFilter)
   275  }
   276  func IsFailed(err error) bool {
   277  	return checkError(err, Failed)
   278  }
   279  func IsOldVersion(err error) bool {
   280  	return checkError(err, OldVersion)
   281  }
   282  func IsUpdateFailed(err error) bool {
   283  	return checkError(err, UpdateFailed)
   284  }
   285  func IsNotImplemented(err error) bool {
   286  	return checkError(err, NotImplemented)
   287  }
   288  func IsUnknown(err error) bool {
   289  	return checkError(err, Unknown)
   290  }
   291  func IsWrongHost(err error) bool {
   292  	return checkError(err, WrongHost)
   293  }
   294  func IsPoolFull(err error) bool {
   295  	return checkError(err, PoolFull)
   296  }
   297  func IsNoActionTaken(err error) bool {
   298  	return checkError(err, NoActionTaken)
   299  }
   300  func IsExpired(err error) bool {
   301  	return checkError(err, Expired)
   302  }
   303  func IsRevoked(err error) bool {
   304  	return checkError(err, Revoked)
   305  }
   306  func IsTimeout(err error) bool {
   307  	return checkError(err, Timeout)
   308  }
   309  func IsInvalidToken(err error) bool {
   310  	return checkError(err, InvalidToken)
   311  }
   312  func IsDeleteFailed(err error) bool {
   313  	return checkError(err, DeleteFailed)
   314  }
   315  func IsDeletePending(err error) bool {
   316  	return checkError(err, DeletePending)
   317  }
   318  
   319  func IsErrDeadlineExceeded(err error) bool {
   320  	return checkError(err, os.ErrDeadlineExceeded)
   321  }
   322  
   323  func IsRunCommandFailed(err error) bool {
   324  	return checkError(err, RunCommandFailed)
   325  }
   326  
   327  func IsFileNotFound(err error) bool {
   328  	return checkError(err, FileNotFound)
   329  }
   330  
   331  func IsPathNotFound(err error) bool {
   332  	return checkError(err, PathNotFound)
   333  }
   334  
   335  func IsNotEnoughSpace(err error) bool {
   336  	return checkError(err, NotEnoughSpace)
   337  }
   338  
   339  func IsAccessDenied(err error) bool {
   340  	return checkError(err, AccessDenied)
   341  }
   342  
   343  func IsBlobNotFound(err error) bool {
   344  	return checkError(err, BlobNotFound)
   345  }
   346  
   347  func IsGenericFailure(err error) bool {
   348  	return checkError(err, GenericFailure)
   349  }
   350  
   351  func IsNoAuthenticationInformation(err error) bool {
   352  	return checkError(err, NoAuthenticationInformation)
   353  }
   354  
   355  func IsMeasurementUnitError(err error) bool {
   356  	return checkError(err, MeasurementUnitError)
   357  }
   358  
   359  func IsQuotaViolation(err error) bool {
   360  	return checkError(err, QuotaViolation)
   361  }
   362  
   363  func IsIPOutOfRange(err error) bool {
   364  	return checkError(err, IPOutOfRange)
   365  }
   366  
   367  func checkError(wrappedError, err error) bool {
   368  	if wrappedError == nil {
   369  		return false
   370  	}
   371  	if wrappedError == err {
   372  		return true
   373  	}
   374  	cerr := perrors.Cause(wrappedError)
   375  	if cerr != nil && cerr == err {
   376  		return true
   377  	}
   378  
   379  	if !IsGRPCUnknown(err) {
   380  		return false
   381  	}
   382  
   383  	// Post this, this is a GRPC unknown error
   384  	// Try to parse the Message and match the error
   385  	wrappedErrorLowercase := strings.ToLower(wrappedError.Error())
   386  	errLowercase := strings.ToLower(err.Error())
   387  	if strings.Contains(wrappedErrorLowercase, errLowercase) {
   388  		return true
   389  	}
   390  
   391  	return false
   392  }
   393  
   394  func New(errString string) error {
   395  	return errors.New(errString)
   396  }