From 9122ed7b2511db9b7a9d40ea024224f4c2950c5d Mon Sep 17 00:00:00 2001 From: jeff Date: Tue, 4 Dec 2018 01:21:28 +0800 Subject: [PATCH] refactor component status Signed-off-by: jeff --- .../v1alpha/components/components_handler.go | 29 +++++++- pkg/models/components.go | 67 +++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/pkg/apis/v1alpha/components/components_handler.go b/pkg/apis/v1alpha/components/components_handler.go index 342de69e7..d8be77095 100644 --- a/pkg/apis/v1alpha/components/components_handler.go +++ b/pkg/apis/v1alpha/components/components_handler.go @@ -19,6 +19,8 @@ package components import ( "net/http" + "github.com/golang/glog" + "github.com/emicklei/go-restful" "kubesphere.io/kubesphere/pkg/constants" @@ -34,6 +36,24 @@ func Register(ws *restful.WebService, subPath string) { Filter(route.RouteLogging)). Consumes(restful.MIME_JSON, restful.MIME_XML). Produces(restful.MIME_JSON) + ws.Route(ws.GET("/health").To(handleGetSystemHealthStatus).Filter(route.RouteLogging)). + Consumes(restful.MIME_JSON, restful.MIME_XML). + Produces(restful.MIME_JSON) +} + +func handleGetSystemHealthStatus(request *restful.Request, response *restful.Response) { + + if status, err := models.GetSystemHealthStatus(); err != nil { + err = response.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()}) + if err != nil { + glog.Errorln(err) + } + } else { + err = response.WriteAsJson(status) + if err != nil { + glog.Errorln(err) + } + } } // get a specific component status @@ -42,9 +62,14 @@ func handleGetComponentStatus(request *restful.Request, response *restful.Respon componentName := request.PathParameter("componentName") if component, err := models.GetComponentStatus(namespace, componentName); err != nil { - response.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()}) + err = response.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()}) + if err != nil { + glog.Errorln(err) + } } else { - response.WriteAsJson(component) + if err = response.WriteAsJson(component); err != nil { + glog.Errorln(err) + } } } diff --git a/pkg/models/components.go b/pkg/models/components.go index 21691bfb1..37269a622 100644 --- a/pkg/models/components.go +++ b/pkg/models/components.go @@ -19,6 +19,11 @@ package models import ( "time" + v13 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1" + + "kubesphere.io/kubesphere/pkg/client" + v12 "k8s.io/client-go/listers/core/v1" "kubesphere.io/kubesphere/pkg/models/controllers" @@ -98,6 +103,68 @@ func GetComponentStatus(namespace string, componentName string) (interface{}, er } +func GetSystemHealthStatus() (map[string]interface{}, error) { + + status := make(map[string]interface{}) + + k8sClient := client.NewK8sClient() + + csList, err := k8sClient.Core().ComponentStatuses().List(v1.ListOptions{}) + if err != nil { + glog.Errorln(err) + return nil, err + } + + for _, cs := range csList.Items { + status[cs.Name] = cs.Conditions[0] + } + + // get kubesphere-system components + + systemComponentStatus, err := GetAllComponentsStatus() + if err != nil { + glog.Errorln(err) + } + + for k, v := range systemComponentStatus { + status[k] = v + } + // get node status + + lister, err := controllers.GetLister(controllers.Nodes) + if err != nil { + glog.Errorln(err) + return status, nil + } + + nodeLister := lister.(v12.NodeLister) + + nodes, err := nodeLister.List(labels.Everything()) + if err != nil { + glog.Errorln(err) + return status, nil + } + + nodeStatus := make(map[string]int) + totalNodes := 0 + healthyNodes := 0 + for _, nodes := range nodes { + totalNodes++ + for _, condition := range nodes.Status.Conditions { + if condition.Type == v13.NodeReady && condition.Status == v13.ConditionTrue { + healthyNodes++ + } + } + } + nodeStatus["totalNodes"] = totalNodes + nodeStatus["healthyNodes"] = healthyNodes + + status["nodes"] = nodeStatus + + return status, nil + +} + func GetAllComponentsStatus() (map[string]interface{}, error) { status := make(map[string]interface{})