From b286baf12ed4290a2878e4ec4a9d54355251b04f Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Sun, 25 Oct 2020 21:27:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=98=BE=E7=A4=BASSH=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E9=9B=86=E7=BE=A4=E3=80=81=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/db/models/node_cluster_dao.go | 19 +++++++ internal/db/models/node_dao.go | 23 ++++++++ internal/rpc/services/service_node.go | 53 +++++++++++++++++++ internal/rpc/services/service_node_cluster.go | 41 ++++++++++++++ internal/tasks/node_monitor_task.go | 2 + 5 files changed, 138 insertions(+) diff --git a/internal/db/models/node_cluster_dao.go b/internal/db/models/node_cluster_dao.go index bee28303..1963f6ce 100644 --- a/internal/db/models/node_cluster_dao.go +++ b/internal/db/models/node_cluster_dao.go @@ -249,6 +249,25 @@ func (this *NodeClusterDAO) UpdateClusterHealthCheck(clusterId int64, healthChec return err } +// 计算使用某个认证的集群数量 +func (this *NodeClusterDAO) CountAllEnabledClustersWithGrantId(grantId int64) (int64, error) { + return this.Query(). + State(NodeClusterStateEnabled). + Attr("grantId", grantId). + Count() +} + +// 获取使用某个认证的所有集群 +func (this *NodeClusterDAO) FindAllEnabledClustersWithGrantId(grantId int64) (result []*NodeCluster, err error) { + _, err = this.Query(). + State(NodeClusterStateEnabled). + Attr("grantId", grantId). + Slice(&result). + DescPk(). + FindAll() + return +} + // 生成唯一ID func (this *NodeClusterDAO) genUniqueId() (string, error) { for { diff --git a/internal/db/models/node_dao.go b/internal/db/models/node_dao.go index 79ff5db4..dbf2861c 100644 --- a/internal/db/models/node_dao.go +++ b/internal/db/models/node_dao.go @@ -9,6 +9,7 @@ import ( _ "github.com/go-sql-driver/mysql" "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/maps" "github.com/iwind/TeaGo/rands" "github.com/iwind/TeaGo/types" "strconv" @@ -300,6 +301,7 @@ func (this *NodeDAO) FindAllInactiveNodesWithClusterId(clusterId int64) (result State(NodeStateEnabled). Attr("clusterId", clusterId). Attr("isOn", true). // 只监控启用的节点 + Attr("isInstalled", true). // 只监控已经安装的节点 Where("(status IS NULL OR (JSON_EXTRACT(status, '$.isActive')=false AND UNIX_TIMESTAMP()-JSON_EXTRACT(status, '$.updatedAt')>10) OR UNIX_TIMESTAMP()-JSON_EXTRACT(status, '$.updatedAt')>120)"). Slice(&result). FindAll() @@ -501,6 +503,27 @@ func (this *NodeDAO) FindEnabledNodeIdWithUniqueId(uniqueId string) (int64, erro FindInt64Col(0) } +// 计算使用某个认证的节点数量 +func (this *NodeDAO) CountAllEnabledNodesWithGrantId(grantId int64) (int64, error) { + return this.Query(). + State(NodeStateEnabled). + Where("id IN (SELECT nodeId FROM edgeNodeLogins WHERE type='ssh' AND JSON_CONTAINS(params, :grantParam))"). + Param("grantParam", string(maps.Map{"grantId": grantId}.AsJSON())). + Count() +} + +// 查找使用某个认证的所有节点 +func (this *NodeDAO) FindAllEnabledNodesWithGrantId(grantId int64) (result []*Node, err error) { + _, err = this.Query(). + State(NodeStateEnabled). + Where("id IN (SELECT nodeId FROM edgeNodeLogins WHERE type='ssh' AND JSON_CONTAINS(params, :grantParam))"). + Param("grantParam", string(maps.Map{"grantId": grantId}.AsJSON())). + Slice(&result). + DescPk(). + FindAll() + return +} + // 生成唯一ID func (this *NodeDAO) genUniqueId() (string, error) { for { diff --git a/internal/rpc/services/service_node.go b/internal/rpc/services/service_node.go index 1aacd404..88d7b3fa 100644 --- a/internal/rpc/services/service_node.go +++ b/internal/rpc/services/service_node.go @@ -428,3 +428,56 @@ func (this *NodeService) UpdateNodeConnectedAPINodes(ctx context.Context, req *p return rpcutils.RPCUpdateSuccess() } + +// 计算使用某个认证的节点数量 +func (this *NodeService) CountAllEnabledNodesWithGrantId(ctx context.Context, req *pb.CountAllEnabledNodesWithGrantIdRequest) (*pb.CountAllEnabledNodesWithGrantIdResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + count, err := models.SharedNodeDAO.CountAllEnabledNodesWithGrantId(req.GrantId) + if err != nil { + return nil, err + } + return &pb.CountAllEnabledNodesWithGrantIdResponse{Count: count}, nil +} + +// 查找使用某个认证的所有节点 +func (this *NodeService) FindAllEnabledNodesWithGrantId(ctx context.Context, req *pb.FindAllEnabledNodesWithGrantIdRequest) (*pb.FindAllEnabledNodesWithGrantIdResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + nodes, err := models.SharedNodeDAO.FindAllEnabledNodesWithGrantId(req.GrantId) + if err != nil { + return nil, err + } + + result := []*pb.Node{} + for _, node := range nodes { + // 集群信息 + clusterName, err := models.SharedNodeClusterDAO.FindNodeClusterName(int64(node.ClusterId)) + if err != nil { + return nil, err + } + + result = append(result, &pb.Node{ + Id: int64(node.Id), + Name: node.Name, + Version: int64(node.Version), + IsInstalled: node.IsInstalled == 1, + Status: node.Status, + Cluster: &pb.NodeCluster{ + Id: int64(node.ClusterId), + Name: clusterName, + }, + IsOn: node.IsOn == 1, + }) + } + + return &pb.FindAllEnabledNodesWithGrantIdResponse{Nodes: result}, nil +} diff --git a/internal/rpc/services/service_node_cluster.go b/internal/rpc/services/service_node_cluster.go index e045f796..815d5102 100644 --- a/internal/rpc/services/service_node_cluster.go +++ b/internal/rpc/services/service_node_cluster.go @@ -309,3 +309,44 @@ func (this *NodeClusterService) ExecuteNodeClusterHealthCheck(ctx context.Contex } return &pb.ExecuteNodeClusterHealthCheckResponse{Results: pbResults}, nil } + +// 计算使用某个认证的集群数量 +func (this *NodeClusterService) CountAllEnabledNodeClustersWithGrantId(ctx context.Context, req *pb.CountAllEnabledNodeClustersWithGrantIdRequest) (*pb.CountAllEnabledNodeClustersWithGrantIdResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + count, err := models.SharedNodeClusterDAO.CountAllEnabledClustersWithGrantId(req.GrantId) + if err != nil { + return nil, err + } + return &pb.CountAllEnabledNodeClustersWithGrantIdResponse{Count: count}, nil +} + +// 查找使用某个认证的所有集群 +func (this *NodeClusterService) FindAllEnabledNodeClustersWithGrantId(ctx context.Context, req *pb.FindAllEnabledNodeClustersWithGrantIdRequest) (*pb.FindAllEnabledNodeClustersWithGrantIdResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + clusters, err := models.SharedNodeClusterDAO.FindAllEnabledClustersWithGrantId(req.GrantId) + if err != nil { + return nil, err + } + + result := []*pb.NodeCluster{} + for _, cluster := range clusters { + result = append(result, &pb.NodeCluster{ + Id: int64(cluster.Id), + Name: cluster.Name, + CreatedAt: int64(cluster.CreatedAt), + UniqueId: cluster.UniqueId, + Secret: cluster.Secret, + }) + } + return &pb.FindAllEnabledNodeClustersWithGrantIdResponse{Clusters: result}, nil +} diff --git a/internal/tasks/node_monitor_task.go b/internal/tasks/node_monitor_task.go index 883c8a8e..fcd2b5f8 100644 --- a/internal/tasks/node_monitor_task.go +++ b/internal/tasks/node_monitor_task.go @@ -85,6 +85,8 @@ func (this *NodeMonitorTask) monitorCluster(cluster *models.NodeCluster) error { } } + // TODO 检查恢复连接 + // 检查CPU、内存、磁盘不足节点,而且离线的节点不再重复提示 // TODO 需要实现