Răsfoiți Sursa

Implemented externalize for k8s api connection errors for more detailed object

jnfrati 5 ani în urmă
părinte
comite
2a17e45650

+ 33 - 1
internal/kubernetes/errors.go

@@ -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(),
+	}
+}

+ 1 - 1
internal/models/cluster.go

@@ -118,7 +118,7 @@ type ClusterDetailedExternal struct {
 	IngressIP string `json:"ingress_ip"`
 
 	// Error displayed in case couldn't get the IP
-	IngressError string `json:"ingress_error"`
+	IngressError error `json:"ingress_error"`
 }
 
 func (c *Cluster) DetailedExternalize() *ClusterDetailedExternal {

+ 1 - 1
server/api/cluster_handler.go

@@ -107,7 +107,7 @@ func (app *App) HandleReadProjectCluster(w http.ResponseWriter, r *http.Request)
 	}
 
 	if !found && ingressErr != nil {
-		clusterExt.IngressError = kubernetes.CatchK8sConnectionError(ingressErr).Error()
+		clusterExt.IngressError = kubernetes.CatchK8sConnectionError(ingressErr).Externalize()
 	}
 
 	w.WriteHeader(http.StatusOK)