github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/agent/exec/errors.go (about) 1 package exec 2 3 import "github.com/pkg/errors" 4 5 var ( 6 // ErrRuntimeUnsupported encountered when a task requires a runtime 7 // unsupported by the executor. 8 ErrRuntimeUnsupported = errors.New("exec: unsupported runtime") 9 10 // ErrTaskPrepared is called if the task is already prepared. 11 ErrTaskPrepared = errors.New("exec: task already prepared") 12 13 // ErrTaskStarted can be returned from any operation that cannot be 14 // performed because the task has already been started. This does not imply 15 // that the task is running but rather that it is no longer valid to call 16 // Start. 17 ErrTaskStarted = errors.New("exec: task already started") 18 19 // ErrTaskUpdateRejected is returned if a task update is rejected by a controller. 20 ErrTaskUpdateRejected = errors.New("exec: task update rejected") 21 22 // ErrControllerClosed returned when a task controller has been closed. 23 ErrControllerClosed = errors.New("exec: controller closed") 24 25 // ErrTaskRetry is returned by Do when an operation failed by should be 26 // retried. The status should still be reported in this case. 27 ErrTaskRetry = errors.New("exec: task retry") 28 29 // ErrTaskNoop returns when the a subsequent call to Do will not result in 30 // advancing the task. Callers should avoid calling Do until the task has been updated. 31 ErrTaskNoop = errors.New("exec: task noop") 32 ) 33 34 // ExitCoder is implemented by errors that have an exit code. 35 type ExitCoder interface { 36 // ExitCode returns the exit code. 37 ExitCode() int 38 } 39 40 // Temporary indicates whether or not the error condition is temporary. 41 // 42 // If this is encountered in the controller, the failing operation will be 43 // retried when this returns true. Otherwise, the operation is considered 44 // fatal. 45 type Temporary interface { 46 Temporary() bool 47 } 48 49 // MakeTemporary makes the error temporary. 50 func MakeTemporary(err error) error { 51 if IsTemporary(err) { 52 return err 53 } 54 55 return temporary{err} 56 } 57 58 type temporary struct { 59 error 60 } 61 62 func (t temporary) Cause() error { return t.error } 63 func (t temporary) Temporary() bool { return true } 64 65 // IsTemporary returns true if the error or a recursive cause returns true for 66 // temporary. 67 func IsTemporary(err error) bool { 68 for err != nil { 69 if tmp, ok := err.(Temporary); ok && tmp.Temporary() { 70 return true 71 } 72 73 cause := errors.Cause(err) 74 if cause == err { 75 break 76 } 77 78 err = cause 79 } 80 81 return false 82 }