|
|
@@ -10,7 +10,18 @@ import (
|
|
|
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
|
|
|
)
|
|
|
|
|
|
-func CatchK8sConnectionError(err error) error {
|
|
|
+type ErrExternalized struct {
|
|
|
+ error
|
|
|
+ Message string `json:"message"`
|
|
|
+ Details string `json:"error"`
|
|
|
+}
|
|
|
+
|
|
|
+type K8sConnectionError interface {
|
|
|
+ Externalize() *ErrExternalized
|
|
|
+ Error() string
|
|
|
+}
|
|
|
+
|
|
|
+func CatchK8sConnectionError(err error) K8sConnectionError {
|
|
|
if uerr, ok := err.(*url.Error); ok {
|
|
|
if noerr, ok := uerr.Err.(*net.OpError); ok {
|
|
|
if scerr, ok := noerr.Err.(*os.SyscallError); ok {
|
|
|
@@ -48,6 +59,13 @@ func (e *ErrUnknown) Error() string {
|
|
|
return fmt.Sprintf("Unknown or unhandled error: %s", e.k8sErr.Error())
|
|
|
}
|
|
|
|
|
|
+func (e *ErrUnknown) Externalize() *ErrExternalized {
|
|
|
+ return &ErrExternalized{
|
|
|
+ Message: "Unknown or unhandled error",
|
|
|
+ Details: e.Error(),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// For ECONNREFUSED and errors.IsTimeout
|
|
|
type ErrConnection struct {
|
|
|
k8sErr error
|
|
|
@@ -57,6 +75,13 @@ func (e *ErrConnection) Error() string {
|
|
|
return fmt.Sprintf("Could not connect to cluster: %s", e.k8sErr.Error())
|
|
|
}
|
|
|
|
|
|
+func (e *ErrConnection) Externalize() *ErrExternalized {
|
|
|
+ return &ErrExternalized{
|
|
|
+ Message: "Could not connect to cluster",
|
|
|
+ Details: e.Error(),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// For errors.IsForbidden and errors.IsUnauthorized
|
|
|
type ErrUnauthorized struct {
|
|
|
k8sErr error
|
|
|
@@ -65,3 +90,10 @@ type ErrUnauthorized struct {
|
|
|
func (e *ErrUnauthorized) Error() string {
|
|
|
return fmt.Sprintf("Unauthorized: %s", e.k8sErr.Error())
|
|
|
}
|
|
|
+
|
|
|
+func (e *ErrUnauthorized) Externalize() *ErrExternalized {
|
|
|
+ return &ErrExternalized{
|
|
|
+ Message: "Unauthorized",
|
|
|
+ Details: e.Error(),
|
|
|
+ }
|
|
|
+}
|