[区域]增加区域管理

This commit is contained in:
刘祥超
2020-12-10 15:03:03 +08:00
parent 82543e9fde
commit bddd0a3a4f
10 changed files with 317 additions and 4 deletions

View File

@@ -1,7 +1,7 @@
package teaconst package teaconst
const ( const (
Version = "0.0.5" Version = "0.0.6"
ProductName = "Edge API" ProductName = "Edge API"
ProcessName = "edge-api" ProcessName = "edge-api"

View File

@@ -618,6 +618,14 @@ func (this *NodeDAO) CountAllEnabledNodesWithGroupId(groupId int64) (int64, erro
Count() Count()
} }
// 查找某个节点区域下的所有节点数量
func (this *NodeDAO) CountAllEnabledNodesWithRegionId(regionId int64) (int64, error) {
return this.Query().
State(NodeStateEnabled).
Attr("regionId", regionId).
Count()
}
// 获取一个集群的节点DNS信息 // 获取一个集群的节点DNS信息
func (this *NodeDAO) FindAllEnabledNodesDNSWithClusterId(clusterId int64) (result []*Node, err error) { func (this *NodeDAO) FindAllEnabledNodesDNSWithClusterId(clusterId int64) (result []*Node, err error) {
_, err = this.Query(). _, err = this.Query().

View File

@@ -0,0 +1,133 @@
package models
import (
"github.com/TeaOSLab/EdgeAPI/internal/errors"
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
)
const (
NodeRegionStateEnabled = 1 // 已启用
NodeRegionStateDisabled = 0 // 已禁用
)
type NodeRegionDAO dbs.DAO
func NewNodeRegionDAO() *NodeRegionDAO {
return dbs.NewDAO(&NodeRegionDAO{
DAOObject: dbs.DAOObject{
DB: Tea.Env,
Table: "edgeNodeRegions",
Model: new(NodeRegion),
PkName: "id",
},
}).(*NodeRegionDAO)
}
var SharedNodeRegionDAO *NodeRegionDAO
func init() {
dbs.OnReady(func() {
SharedNodeRegionDAO = NewNodeRegionDAO()
})
}
// 启用条目
func (this *NodeRegionDAO) EnableNodeRegion(id int64) error {
_, err := this.Query().
Pk(id).
Set("state", NodeRegionStateEnabled).
Update()
return err
}
// 禁用条目
func (this *NodeRegionDAO) DisableNodeRegion(id int64) error {
_, err := this.Query().
Pk(id).
Set("state", NodeRegionStateDisabled).
Update()
return err
}
// 查找启用中的条目
func (this *NodeRegionDAO) FindEnabledNodeRegion(id int64) (*NodeRegion, error) {
result, err := this.Query().
Pk(id).
Attr("state", NodeRegionStateEnabled).
Find()
if result == nil {
return nil, err
}
return result.(*NodeRegion), err
}
// 根据主键查找名称
func (this *NodeRegionDAO) FindNodeRegionName(id int64) (string, error) {
return this.Query().
Pk(id).
Result("name").
FindStringCol("")
}
// 创建区域
func (this *NodeRegionDAO) CreateRegion(adminId int64, name string) (int64, error) {
op := NewNodeRegionOperator()
op.AdminId = adminId
op.Name = name
op.State = NodeRegionStateEnabled
op.IsOn = true
return this.SaveInt64(op)
}
// 修改区域
func (this *NodeRegionDAO) UpdateRegion(regionId int64, name string, isOn bool) error {
if regionId <= 0 {
return errors.New("invalid regionId")
}
op := NewNodeRegionOperator()
op.Id = regionId
op.Name = name
op.IsOn = isOn
return this.Save(op)
}
// 列出所有区域
func (this *NodeRegionDAO) FindAllEnabledRegions() (result []*NodeRegion, err error) {
_, err = this.Query().
State(NodeRegionStateEnabled).
Desc("order").
AscPk().
Slice(&result).
FindAll()
return
}
// 列出所有启用的区域
func (this *NodeRegionDAO) FindAllEnabledAndOnRegions() (result []*NodeRegion, err error) {
_, err = this.Query().
State(NodeRegionStateEnabled).
Attr("isOn", true).
Desc("order").
AscPk().
Slice(&result).
FindAll()
return
}
// 排序
func (this *NodeRegionDAO) UpdateRegionOrders(regionIds []int64) error {
order := len(regionIds)
for _, regionId := range regionIds {
_, err := this.Query().
Pk(regionId).
Set("order", order).
Update()
if err != nil {
return err
}
order--
}
return nil
}

View File

@@ -0,0 +1,5 @@
package models
import (
_ "github.com/go-sql-driver/mysql"
)

View File

@@ -0,0 +1,26 @@
package models
// 节点区域
type NodeRegion struct {
Id uint32 `field:"id"` // ID
AdminId uint32 `field:"adminId"` // 管理员ID
IsOn uint8 `field:"isOn"` // 是否启用
Name string `field:"name"` // 名称
Order uint32 `field:"order"` // 排序
CreatedAt uint64 `field:"createdAt"` // 创建时间
State uint8 `field:"state"` // 状态
}
type NodeRegionOperator struct {
Id interface{} // ID
AdminId interface{} // 管理员ID
IsOn interface{} // 是否启用
Name interface{} // 名称
Order interface{} // 排序
CreatedAt interface{} // 创建时间
State interface{} // 状态
}
func NewNodeRegionOperator() *NodeRegionOperator {
return &NodeRegionOperator{}
}

View File

@@ -0,0 +1 @@
package models

View File

@@ -185,6 +185,7 @@ func (this *APINode) listenRPC(listener net.Listener, tlsConfig *tls.Config) err
pb.RegisterHTTPAccessLogServiceServer(rpcServer, &services.HTTPAccessLogService{}) pb.RegisterHTTPAccessLogServiceServer(rpcServer, &services.HTTPAccessLogService{})
pb.RegisterMessageServiceServer(rpcServer, &services.MessageService{}) pb.RegisterMessageServiceServer(rpcServer, &services.MessageService{})
pb.RegisterNodeGroupServiceServer(rpcServer, &services.NodeGroupService{}) pb.RegisterNodeGroupServiceServer(rpcServer, &services.NodeGroupService{})
pb.RegisterNodeRegionServiceServer(rpcServer, &services.NodeRegionService{})
pb.RegisterServerGroupServiceServer(rpcServer, &services.ServerGroupService{}) pb.RegisterServerGroupServiceServer(rpcServer, &services.ServerGroupService{})
pb.RegisterIPLibraryServiceServer(rpcServer, &services.IPLibraryService{}) pb.RegisterIPLibraryServiceServer(rpcServer, &services.IPLibraryService{})
pb.RegisterFileChunkServiceServer(rpcServer, &services.FileChunkService{}) pb.RegisterFileChunkServiceServer(rpcServer, &services.FileChunkService{})

View File

@@ -975,14 +975,14 @@ func (this *NodeService) UpdateNodeLogin(ctx context.Context, req *pb.UpdateNode
} }
// 计算某个节点分组内的节点数量 // 计算某个节点分组内的节点数量
func (this *NodeService) CountAllEnabledNodesWithGroupId(ctx context.Context, req *pb.CountAllEnabledNodesWithGroupIdRequest) (*pb.RPCCountResponse, error) { func (this *NodeService) CountAllEnabledNodesWithNodeGroupId(ctx context.Context, req *pb.CountAllEnabledNodesWithNodeGroupIdRequest) (*pb.RPCCountResponse, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
if err != nil { if err != nil {
return nil, err return nil, err
} }
count, err := models.SharedNodeDAO.CountAllEnabledNodesWithGroupId(req.GroupId) count, err := models.SharedNodeDAO.CountAllEnabledNodesWithGroupId(req.NodeGroupId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -1212,3 +1212,16 @@ func (this *NodeService) notifyNodeDNSChanged(nodeId int64) error {
} }
return nil return nil
} }
// 计算某个区域下的节点数量
func (this *NodeService) CountAllEnabledNodesWithNodeRegionId(ctx context.Context, req *pb.CountAllEnabledNodesWithNodeRegionIdRequest) (*pb.RPCCountResponse, error) {
_, err := this.ValidateAdmin(ctx, 0)
if err != nil {
return nil, err
}
count, err := models.SharedNodeDAO.CountAllEnabledNodesWithRegionId(req.NodeRegionId)
if err != nil {
return nil, err
}
return this.SuccessCount(count)
}

View File

@@ -0,0 +1,126 @@
package services
import (
"context"
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
// 节点区域相关服务
type NodeRegionService struct {
BaseService
}
// 创建区域
func (this *NodeRegionService) CreateNodeRegion(ctx context.Context, req *pb.CreateNodeRegionRequest) (*pb.CreateNodeRegionResponse, error) {
adminId, err := this.ValidateAdmin(ctx, 0)
if err != nil {
return nil, err
}
regionId, err := models.SharedNodeRegionDAO.CreateRegion(adminId, req.Name)
if err != nil {
return nil, err
}
return &pb.CreateNodeRegionResponse{NodeRegionId: regionId}, nil
}
// 修改区域
func (this *NodeRegionService) UpdateNodeRegion(ctx context.Context, req *pb.UpdateNodeRegionRequest) (*pb.RPCSuccess, error) {
_, err := this.ValidateAdmin(ctx, 0)
if err != nil {
return nil, err
}
err = models.SharedNodeRegionDAO.UpdateRegion(req.NodeRegionId, req.Name, req.IsOn)
if err != nil {
return nil, err
}
return this.Success()
}
// 删除区域
func (this *NodeRegionService) DeleteNodeRegion(ctx context.Context, req *pb.DeleteNodeRegionRequest) (*pb.RPCSuccess, error) {
_, err := this.ValidateAdmin(ctx, 0)
if err != nil {
return nil, err
}
err = models.SharedNodeRegionDAO.DisableNodeRegion(req.NodeRegionId)
if err != nil {
return nil, err
}
return this.Success()
}
// 查找所有区域
func (this *NodeRegionService) FindAllEnabledNodeRegions(ctx context.Context, req *pb.FindAllEnabledNodeRegionsRequest) (*pb.FindAllEnabledNodeRegionsResponse, error) {
_, err := this.ValidateAdmin(ctx, 0)
if err != nil {
return nil, err
}
regions, err := models.SharedNodeRegionDAO.FindAllEnabledRegions()
if err != nil {
return nil, err
}
result := []*pb.NodeRegion{}
for _, region := range regions {
result = append(result, &pb.NodeRegion{
Id: int64(region.Id),
IsOn: region.IsOn == 1,
Name: region.Name,
})
}
return &pb.FindAllEnabledNodeRegionsResponse{NodeRegions: result}, nil
}
// 查找所有启用的区域
func (this *NodeRegionService) FindAllEnabledAndOnNodeRegions(ctx context.Context, req *pb.FindAllEnabledAndOnNodeRegionsRequest) (*pb.FindAllEnabledAndOnNodeRegionsResponse, error) {
_, err := this.ValidateAdmin(ctx, 0)
if err != nil {
return nil, err
}
regions, err := models.SharedNodeRegionDAO.FindAllEnabledAndOnRegions()
if err != nil {
return nil, err
}
result := []*pb.NodeRegion{}
for _, region := range regions {
result = append(result, &pb.NodeRegion{
Id: int64(region.Id),
IsOn: region.IsOn == 1,
Name: region.Name,
})
}
return &pb.FindAllEnabledAndOnNodeRegionsResponse{NodeRegions: result}, nil
}
// 排序
func (this *NodeRegionService) UpdateNodeRegionOrders(ctx context.Context, req *pb.UpdateNodeRegionOrdersRequest) (*pb.RPCSuccess, error) {
_, err := this.ValidateAdmin(ctx, 0)
if err != nil {
return nil, err
}
err = models.SharedNodeRegionDAO.UpdateRegionOrders(req.NodeRegionIds)
if err != nil {
return nil, err
}
return this.Success()
}
// 查找单个区域信息
func (this *NodeRegionService) FindEnabledNodeRegion(ctx context.Context, req *pb.FindEnabledNodeRegionRequest) (*pb.FindEnabledNodeRegionResponse, error) {
_, err := this.ValidateAdmin(ctx, 0)
if err != nil {
return nil, err
}
region, err := models.SharedNodeRegionDAO.FindEnabledNodeRegion(req.NodeRegionId)
if err != nil {
return nil, err
}
if region == nil {
return &pb.FindEnabledNodeRegionResponse{NodeRegion: nil}, nil
}
return &pb.FindEnabledNodeRegionResponse{NodeRegion: &pb.NodeRegion{
Id: int64(region.Id),
IsOn: region.IsOn == 1,
Name: region.Name,
}}, nil
}

File diff suppressed because one or more lines are too long