From 6af8bff802b4b7237bef74b4fb043aa6efb6cc0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Thu, 20 Oct 2022 15:11:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=93=8D=E4=BD=9C=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=8C=BA=E5=9F=9F=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/db/models/node_cluster_dao.go | 2 +- internal/db/models/node_dao.go | 43 ++++++++++++ internal/rpc/services/service_node.go | 94 ++++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) diff --git a/internal/db/models/node_cluster_dao.go b/internal/db/models/node_cluster_dao.go index 2883d3eb..b92b199f 100644 --- a/internal/db/models/node_cluster_dao.go +++ b/internal/db/models/node_cluster_dao.go @@ -967,7 +967,7 @@ func (this *NodeClusterDAO) FindClusterBasicInfo(tx *dbs.Tx, clusterId int64, ca cluster, err := this.Query(tx). Pk(clusterId). State(NodeClusterStateEnabled). - Result("id", "timeZone", "nodeMaxThreads", "cachePolicyId", "httpFirewallPolicyId", "autoOpenPorts", "webp", "uam", "isOn", "ddosProtection", "clock", "globalServerConfig", "autoInstallNftables"). + Result("id", "name", "timeZone", "nodeMaxThreads", "cachePolicyId", "httpFirewallPolicyId", "autoOpenPorts", "webp", "uam", "isOn", "ddosProtection", "clock", "globalServerConfig", "autoInstallNftables"). Find() if err != nil || cluster == nil { return nil, err diff --git a/internal/db/models/node_dao.go b/internal/db/models/node_dao.go index 496281c8..48a7fec2 100644 --- a/internal/db/models/node_dao.go +++ b/internal/db/models/node_dao.go @@ -1417,6 +1417,49 @@ func (this *NodeDAO) CountAllEnabledNodesWithRegionId(tx *dbs.Tx, regionId int64 Count() } +// CountAllNodeRegionInfo 查找所有节点区域信息数量 +func (this *NodeDAO) CountAllNodeRegionInfo(tx *dbs.Tx, regionId int64) (int64, error) { + var query = this.Query(tx). + State(NodeStateEnabled). + Where("clusterId IN (SELECT id FROM " + SharedNodeClusterDAO.Table + " WHERE state=1)") + if regionId > 0 { + query.Attr("regionId", regionId) + } + return query.Count() +} + +// ListNodeRegionInfo 列出节点区域信息 +func (this *NodeDAO) ListNodeRegionInfo(tx *dbs.Tx, regionId int64, offset int64, size int64) (result []*Node, err error) { + var query = this.Query(tx). + Result("id", "name", "clusterId", "regionId"). + State(NodeStateEnabled). + Where("clusterId IN (SELECT id FROM " + SharedNodeClusterDAO.Table + " WHERE state=1)"). + Asc("IF(regionId=0, 0, 1)"). // 按照 regionId 排序是为了让没有设置区域的节点排在最上面 + DescPk(). + Offset(offset). + Limit(size). + Slice(&result) + if regionId > 0 { + query.Attr("regionId", regionId) + } + _, err = query.FindAll() + return +} + +// UpdateNodeRegionId 修改节点所在区域 +func (this *NodeDAO) UpdateNodeRegionId(tx *dbs.Tx, nodeId int64, regionId int64) error { + // 这里允许 regionId 为 0 + err := this.Query(tx). + Pk(nodeId). + Set("regionId", regionId). + UpdateQuickly() + if err != nil { + return err + } + + return this.NotifyUpdate(tx, nodeId) +} + // FindAllEnabledNodesDNSWithClusterId 获取一个集群的节点DNS信息 func (this *NodeDAO) FindAllEnabledNodesDNSWithClusterId(tx *dbs.Tx, clusterId int64, includeSecondaryNodes bool, includingLnNodes bool) (result []*Node, err error) { if clusterId <= 0 { diff --git a/internal/rpc/services/service_node.go b/internal/rpc/services/service_node.go index cc9cc0ac..4b192672 100644 --- a/internal/rpc/services/service_node.go +++ b/internal/rpc/services/service_node.go @@ -2013,3 +2013,97 @@ func (this *NodeService) FindEnabledNodeConfigInfo(ctx context.Context, req *pb. return result, nil } + +// CountAllNodeRegionInfo 查找节点区域信息数量 +func (this *NodeService) CountAllNodeRegionInfo(ctx context.Context, req *pb.CountAllNodeRegionInfoRequest) (*pb.RPCCountResponse, error) { + _, err := this.ValidateAdmin(ctx) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + count, err := models.SharedNodeDAO.CountAllNodeRegionInfo(tx, req.NodeRegionId) + if err != nil { + return nil, err + } + return this.SuccessCount(count) +} + +// ListNodeRegionInfo 列出单页节点区域信息 +func (this *NodeService) ListNodeRegionInfo(ctx context.Context, req *pb.ListNodeRegionInfoRequest) (*pb.ListNodeRegionInfoResponse, error) { + _, err := this.ValidateAdmin(ctx) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + nodes, err := models.SharedNodeDAO.ListNodeRegionInfo(tx, req.NodeRegionId, req.Offset, req.Size) + if err != nil { + return nil, err + } + + var pbInfoList = []*pb.ListNodeRegionInfoResponse_Info{} + var cacheMap = utils.NewCacheMap() + for _, node := range nodes { + // region + var pbRegion *pb.NodeRegion + if node.RegionId > 0 { + region, err := models.SharedNodeRegionDAO.FindEnabledNodeRegion(tx, int64(node.RegionId)) + if err != nil { + return nil, err + } + if region != nil { + pbRegion = &pb.NodeRegion{ + Id: int64(region.Id), + Name: region.Name, + IsOn: region.IsOn, + } + } + } + + // cluster + // 要求必须有cluster + var pbCluster *pb.NodeCluster + if node.ClusterId <= 0 { + continue + } + cluster, err := models.SharedNodeClusterDAO.FindClusterBasicInfo(tx, int64(node.ClusterId), cacheMap) + if err != nil { + return nil, err + } + if cluster == nil { + continue + } + pbCluster = &pb.NodeCluster{ + Id: int64(cluster.Id), + Name: cluster.Name, + IsOn: cluster.IsOn, + } + + pbInfoList = append(pbInfoList, &pb.ListNodeRegionInfoResponse_Info{ + Id: int64(node.Id), + Name: node.Name, + NodeRegion: pbRegion, + NodeCluster: pbCluster, + }) + } + return &pb.ListNodeRegionInfoResponse{ + InfoList: pbInfoList, + }, nil +} + +// UpdateNodeRegionInfo 修改节点区域信息 +func (this *NodeService) UpdateNodeRegionInfo(ctx context.Context, req *pb.UpdateNodeRegionInfoRequest) (*pb.RPCSuccess, error) { + _, err := this.ValidateAdmin(ctx) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + err = models.SharedNodeDAO.UpdateNodeRegionId(tx, req.NodeId, req.NodeRegionId) + if err != nil { + return nil, err + } + + return this.Success() +}