From 4e70f3d8629bfb00bb522857dc00852c37c8eb1d Mon Sep 17 00:00:00 2001 From: bixiaoyan Date: Tue, 18 Feb 2025 17:14:54 +0800 Subject: [PATCH] add cluster_overview function --- controllers/cluster.go | 10 +++ models/manage_clusters.go | 182 ++++++++++++++++++++++++++++++++++++++ routers/router.go | 3 +- 3 files changed, 194 insertions(+), 1 deletion(-) diff --git a/controllers/cluster.go b/controllers/cluster.go index ceb93e9..6bb805e 100644 --- a/controllers/cluster.go +++ b/controllers/cluster.go @@ -29,6 +29,10 @@ type Sync_configController struct { web.Controller } +type ClusterOverviewController struct { + web.Controller +} + type ClusterSetupController struct { web.Controller } @@ -65,6 +69,12 @@ type IsClusterExistController struct { web.Controller } +func (coc *ClusterOverviewController) Get() { + logs.Debug("handle get request in ClusterOverviewController.") + result := models.ClusterOverview() + coc.Data["json"] = &result + coc.ServeJSON() +} func (mcc *MultipleClustersController) Post() { logs.Debug("Handle post request in MultipleClustersController.") result := map[string]interface{}{} diff --git a/models/manage_clusters.go b/models/manage_clusters.go index 9fc3203..5c748d6 100644 --- a/models/manage_clusters.go +++ b/models/manage_clusters.go @@ -276,6 +276,151 @@ func ClusterInfo() map[string]interface{} { } } +func ClusterOverview() map[string]interface{} { + _ = ClusterInfo() + clusterExist := false + localClusterName := "" + clusterExistInfo := CheckIsClusterExist() + if clusterExistInfo["action"] == true { + clusterExist = true + localClusterName = clusterExistInfo["cluster_name"].(string) + } + localConf := getLocalConf() + clusters := localConf.Clusters + clusterSum := len(clusters) + if clusterSum == 0 { + return map[string]interface{}{ + "action": false, + "cluster_exist": clusterExist, + "local_cluster_name": localClusterName, + "cluster_data": []interface{}{}, + } + } + var wg sync.WaitGroup + if len(localConf.Clusters) > 0 { + + for _, cluster := range localConf.Clusters { + // ips := []IP + // for _, ipInfo := range cluster.Ip { + // oneNodeIp := make(map[string]interface{}) + // for k, v := range ipInfo { + // if k != "type" && k != "status" { + // oneNodeIp[k] = v + // } + // } + // ips = append(ips, oneNodeIp) + // } + // ips := []*IP{} + // for _, ipInfo := range cluster.Ip { + // ip := newIP() + // for k, v := range ipInfo { + // if strings.HasPrefix(k, "ring") && strings.HasSuffix(k, "_addr") { + // ringNum := k[4 : len(k)-5] + + // if addr, ok := v.(string); ok { + // ip.Addrs[ringNum] = addr + // } + // } + // } + // ips = append(ips, ip) + // } + ips := extractIPs(cluster) + + wg.Add(1) + go func(cluster Cluster) { + defer wg.Done() + oneClusterOverview(cluster, localConf, ips, &wg) + }(cluster) + } + wg.Wait() + } + return map[string]interface{}{ + "action": true, + "cluster_exist": clusterExist, + "local_cluster_name": localClusterName, + "cluster_data": []interface{}{}, + } +} + +func extractIPs(clusters Cluster) []IP { + var ips []IP + for _, ipEntry := range clusters.Ip { + newIP := IP{Addrs: make(map[string]string)} + for key, value := range ipEntry { + if strings.HasPrefix(key, "ring") { + ringNum := key[4 : len(key)-5] + newIP.Addrs["ring"+ringNum] = value.(string) + } + } + ips = append(ips, newIP) + } + return ips +} + +func oneClusterOverview(cluster Cluster, localconf *ClustersInfo, ips []IP, wg *sync.WaitGroup) oneClusterOverviewRes { + var singleClusterInfo oneClusterOverviewRes + singleClusterInfo.ClusterName = cluster.ClusterName + singleClusterInfo.NodeSum = len(cluster.Nodes) + nodeList := cluster.Nodes + connectNode := 0 + clusterConnect := false + for _, node := range nodeList { + url := fmt.Sprintf(("https://%s/remote/api/v1/managec/local_cluster_overview"), node) + resp, err := http.Get(url) + if err != nil { + // 连接失败异常捕获部分 + continue + } + defer resp.Body.Close() + if resp.StatusCode == http.StatusOK { + clusterConnect = true + connectNode = connectNode + 1 + body, err := io.ReadAll(resp.Body) + if err != nil { + logs.Info("Error reading response body: %v", err) + continue + } + var resInfo localClusterOverviewRes + err = json.Unmarshal(body, &resInfo) + if err != nil { + logs.Info("Error Unmarshal response json: %v", err) + continue + } + if resInfo.Action { + if resInfo.ClusterStart { + var oneClusterOverviewRes oneClusterOverviewRes + oneClusterOverviewRes.ClusterName = resInfo.Data.ClusterName + oneClusterOverviewRes.NodeSum = resInfo.Data.NodeSum + oneClusterOverviewRes.ResourceList = resInfo.Data.ResourceList + oneClusterOverviewRes.ClusterOnline = resInfo.Data.ClusterOnline + oneClusterOverviewRes.Ip = ips + return oneClusterOverviewRes + } else { + connectNode = connectNode - 1 + } + } + } + } + if connectNode == 0 { + var singleNodeInfo Node + for _, node := range nodeList { + singleNodeInfo.Name = node + singleNodeInfo.Online = "false" + singleClusterInfo.NodeList = append(singleClusterInfo.NodeList, singleNodeInfo) + } + if clusterConnect == false { + singleClusterInfo.ClusterOnline = "false" + } else { + singleClusterInfo.ClusterOnline = "stop" + } + singleClusterInfo.Ip = ips + var EmptyResourceList []Resource + singleClusterInfo.ResourceList = EmptyResourceList + return singleClusterInfo + } + return singleClusterInfo +} + func checkClusterExist() []Cluster { localConf := getLocalConf() var wg sync.WaitGroup @@ -298,6 +443,43 @@ type checkClusterExistRes struct { ClusterConf Cluster `json:"cluster_conf"` } +type localClusterOverviewRes struct { + Action bool `json:"action"` + ClusterStart bool `json:"cluster_start"` + Data localClusterOverviewData `json:"data"` +} + +type Node struct { + Name string `json:"name"` + Online string `json:"online"` +} + +type Resource struct { + ID string `json:"id"` + Status string `json:"status"` +} + +type localClusterOverviewData struct { + ClusterName string `json:"cluster_name"` + NodeSum int `json:"node_sum"` + NodeList []Node `json:"node_list"` + ResourceList []Resource `json:"resource_list"` + ClusterOnline string `json:"cluster_online"` +} + +type oneClusterOverviewRes struct { + ClusterName string `json:"cluster_name"` + NodeSum int `json:"node_sum"` + NodeList []Node `json:"node_list"` + ResourceList []Resource `json:"resource_list"` + ClusterOnline string `json:"cluster_online"` + Ip []IP `json:"ip"` +} + +type IP struct { + Addrs map[string]string `json: "-"` +} + func checkOneClusterExist(localConf *ClustersInfo, cluster Cluster, wg *sync.WaitGroup) { defer wg.Done() connectNode := 0 diff --git a/routers/router.go b/routers/router.go index 0c622bf..b1e1d81 100644 --- a/routers/router.go +++ b/routers/router.go @@ -1,6 +1,6 @@ /* * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. - * ha-api licensed under the Mulan Permissive Software License, Version 2. + * ha-api licensed under the Mulan Permissive Software License, Version 2. * See LICENSE file for more details. * Author: yangzhao_kl * Date: Tue Jan 5 09:33:00 2021 +0800 @@ -29,6 +29,7 @@ func init() { web.NSRouter("/login", &controllers.LoginController{}), web.NSRouter("/logout", &controllers.LogoutController{}), web.NSRouter("/user", &controllers.PasswordChangeController{}), + web.NSRouter("/managec/cluster_overview", &controllers.ClusterOverviewController{}), web.NSRouter("/managec/cluster_add", &controllers.MultipleClustersController{}), //web.NSRouter("/managec/sync_config", &controllers.Sync_configController{}), web.NSRouter("/managec/cluster_setup", &controllers.ClusterSetupController{}), -- Gitee