2
0

errors.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. func CatchK8sConnectionError(err error) error {
  11. if uerr, ok := err.(*url.Error); ok {
  12. if noerr, ok := uerr.Err.(*net.OpError); ok {
  13. if scerr, ok := noerr.Err.(*os.SyscallError); ok {
  14. if scerr.Err == syscall.ECONNREFUSED {
  15. return &ErrConnection{
  16. k8sErr: err,
  17. }
  18. }
  19. }
  20. }
  21. }
  22. if k8sErrors.IsTimeout(err) {
  23. return &ErrConnection{
  24. k8sErr: err,
  25. }
  26. }
  27. if k8sErrors.IsUnauthorized(err) || k8sErrors.IsForbidden(err) {
  28. return &ErrUnauthorized{
  29. k8sErr: err,
  30. }
  31. }
  32. return &ErrUnknown{
  33. k8sErr: err,
  34. }
  35. }
  36. type ErrUnknown struct {
  37. k8sErr error
  38. }
  39. func (e *ErrUnknown) Error() string {
  40. return fmt.Sprintf("Unknown or unhandled error: %s", e.k8sErr.Error())
  41. }
  42. // For ECONNREFUSED and errors.IsTimeout
  43. type ErrConnection struct {
  44. k8sErr error
  45. }
  46. func (e *ErrConnection) Error() string {
  47. return fmt.Sprintf("Could not connect to cluster: %s", e.k8sErr.Error())
  48. }
  49. // For errors.IsForbidden and errors.IsUnauthorized
  50. type ErrUnauthorized struct {
  51. k8sErr error
  52. }
  53. func (e *ErrUnauthorized) Error() string {
  54. return fmt.Sprintf("Unauthorized: %s", e.k8sErr.Error())
  55. }