2
0

errors.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package kubernetes
  2. import (
  3. "fmt"
  4. "net"
  5. "net/url"
  6. "os"
  7. "syscall"
  8. k8sErrors "k8s.io/apimachinery/pkg/api/errors"
  9. )
  10. type ErrExternalized struct {
  11. error
  12. Message string `json:"message"`
  13. Details string `json:"error"`
  14. }
  15. type K8sConnectionError interface {
  16. Externalize() *ErrExternalized
  17. Error() string
  18. }
  19. func CatchK8sConnectionError(err error) K8sConnectionError {
  20. if uerr, ok := err.(*url.Error); ok {
  21. if noerr, ok := uerr.Err.(*net.OpError); ok {
  22. if scerr, ok := noerr.Err.(*os.SyscallError); ok {
  23. if scerr.Err == syscall.ECONNREFUSED {
  24. return &ErrConnection{
  25. k8sErr: err,
  26. }
  27. }
  28. }
  29. }
  30. }
  31. if k8sErrors.IsTimeout(err) {
  32. return &ErrConnection{
  33. k8sErr: err,
  34. }
  35. }
  36. if k8sErrors.IsUnauthorized(err) || k8sErrors.IsForbidden(err) {
  37. return &ErrUnauthorized{
  38. k8sErr: err,
  39. }
  40. }
  41. return &ErrUnknown{
  42. k8sErr: err,
  43. }
  44. }
  45. type ErrUnknown struct {
  46. k8sErr error
  47. }
  48. func (e *ErrUnknown) Error() string {
  49. return fmt.Sprintf("Unknown or unhandled error: %s", e.k8sErr.Error())
  50. }
  51. func (e *ErrUnknown) Externalize() *ErrExternalized {
  52. return &ErrExternalized{
  53. Message: "Unknown or unhandled error",
  54. Details: e.Error(),
  55. }
  56. }
  57. // For ECONNREFUSED and errors.IsTimeout
  58. type ErrConnection struct {
  59. k8sErr error
  60. }
  61. func (e *ErrConnection) Error() string {
  62. return fmt.Sprintf("Could not connect to cluster: %s", e.k8sErr.Error())
  63. }
  64. func (e *ErrConnection) Externalize() *ErrExternalized {
  65. return &ErrExternalized{
  66. Message: "Could not connect to cluster",
  67. Details: e.Error(),
  68. }
  69. }
  70. // For errors.IsForbidden and errors.IsUnauthorized
  71. type ErrUnauthorized struct {
  72. k8sErr error
  73. }
  74. func (e *ErrUnauthorized) Error() string {
  75. return fmt.Sprintf("Unauthorized: %s", e.k8sErr.Error())
  76. }
  77. func (e *ErrUnauthorized) Externalize() *ErrExternalized {
  78. return &ErrExternalized{
  79. Message: "Unauthorized",
  80. Details: e.Error(),
  81. }
  82. }