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 }