2021-01-17 16:48:00 +08:00
|
|
|
|
package services
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
|
|
|
|
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
2021-06-10 19:21:45 +08:00
|
|
|
|
"github.com/TeaOSLab/EdgeAPI/internal/installers"
|
2021-08-08 15:47:48 +08:00
|
|
|
|
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
|
|
|
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
2021-01-17 16:48:00 +08:00
|
|
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
|
|
|
|
"github.com/iwind/TeaGo/dbs"
|
2021-06-10 19:21:45 +08:00
|
|
|
|
stringutil "github.com/iwind/TeaGo/utils/string"
|
2021-01-17 16:48:00 +08:00
|
|
|
|
"time"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2021-06-10 19:21:45 +08:00
|
|
|
|
// NodeTaskService 节点同步任务相关服务
|
2021-01-17 16:48:00 +08:00
|
|
|
|
type NodeTaskService struct {
|
|
|
|
|
|
BaseService
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-10 19:21:45 +08:00
|
|
|
|
// FindNodeTasks 获取单节点同步任务
|
2021-01-17 16:48:00 +08:00
|
|
|
|
func (this *NodeTaskService) FindNodeTasks(ctx context.Context, req *pb.FindNodeTasksRequest) (*pb.FindNodeTasksResponse, error) {
|
2021-08-08 15:47:48 +08:00
|
|
|
|
nodeType, nodeId, err := this.ValidateNodeId(ctx, rpcutils.UserTypeNode, rpcutils.UserTypeDNS)
|
2021-01-17 16:48:00 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_ = req
|
|
|
|
|
|
|
|
|
|
|
|
var tx = this.NullTx()
|
2021-08-08 15:47:48 +08:00
|
|
|
|
tasks, err := models.SharedNodeTaskDAO.FindDoingNodeTasks(tx, nodeType, nodeId)
|
2021-01-17 16:48:00 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pbTasks := []*pb.NodeTask{}
|
|
|
|
|
|
for _, task := range tasks {
|
|
|
|
|
|
pbTasks = append(pbTasks, &pb.NodeTask{
|
2021-11-11 14:16:42 +08:00
|
|
|
|
Id: int64(task.Id),
|
|
|
|
|
|
Type: task.Type,
|
|
|
|
|
|
Version: int64(task.Version),
|
|
|
|
|
|
IsPrimary: primaryNodeId == nodeId,
|
2022-01-19 22:15:01 +08:00
|
|
|
|
ServerId: int64(task.ServerId),
|
2021-01-17 16:48:00 +08:00
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-08-08 15:47:48 +08:00
|
|
|
|
// 边缘节点版本更新任务
|
|
|
|
|
|
if nodeType == rpcutils.UserTypeNode {
|
|
|
|
|
|
status, err := models.SharedNodeDAO.FindNodeStatus(tx, nodeId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
if status != nil && len(status.OS) > 0 && len(status.Arch) > 0 && len(status.BuildVersion) > 0 {
|
|
|
|
|
|
deployFile := installers.SharedDeployManager.FindNodeFile(status.OS, status.Arch)
|
|
|
|
|
|
if deployFile != nil {
|
|
|
|
|
|
if stringutil.VersionCompare(deployFile.Version, status.BuildVersion) > 0 {
|
|
|
|
|
|
pbTasks = append(pbTasks, &pb.NodeTask{
|
|
|
|
|
|
Type: models.NodeTaskTypeNodeVersionChanged,
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2021-06-10 19:21:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-01-17 16:48:00 +08:00
|
|
|
|
return &pb.FindNodeTasksResponse{NodeTasks: pbTasks}, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-10 19:21:45 +08:00
|
|
|
|
// ReportNodeTaskDone 报告同步任务结果
|
2021-01-17 16:48:00 +08:00
|
|
|
|
func (this *NodeTaskService) ReportNodeTaskDone(ctx context.Context, req *pb.ReportNodeTaskDoneRequest) (*pb.RPCSuccess, error) {
|
2021-08-08 15:47:48 +08:00
|
|
|
|
_, _, err := this.ValidateNodeId(ctx, rpcutils.UserTypeNode, rpcutils.UserTypeDNS)
|
2021-01-17 16:48:00 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var tx = this.NullTx()
|
|
|
|
|
|
err = models.SharedNodeTaskDAO.UpdateNodeTaskDone(tx, req.NodeTaskId, req.IsOk, req.Error)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return this.Success()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-10 19:21:45 +08:00
|
|
|
|
// FindNodeClusterTasks 获取所有正在同步的集群信息
|
2021-01-17 16:48:00 +08:00
|
|
|
|
func (this *NodeTaskService) FindNodeClusterTasks(ctx context.Context, req *pb.FindNodeClusterTasksRequest) (*pb.FindNodeClusterTasksResponse, error) {
|
|
|
|
|
|
_, err := this.ValidateAdmin(ctx, 0)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_ = req
|
|
|
|
|
|
|
|
|
|
|
|
var tx = this.NullTx()
|
2021-08-08 15:47:48 +08:00
|
|
|
|
// TODO 支持NS节点
|
|
|
|
|
|
clusterIds, err := models.SharedNodeTaskDAO.FindAllDoingTaskClusterIds(tx, nodeconfigs.NodeRoleNode)
|
2021-01-17 16:48:00 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
if len(clusterIds) == 0 {
|
|
|
|
|
|
return &pb.FindNodeClusterTasksResponse{ClusterTasks: []*pb.ClusterTask{}}, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pbClusterTasks := []*pb.ClusterTask{}
|
|
|
|
|
|
for _, clusterId := range clusterIds {
|
|
|
|
|
|
pbClusterTask := &pb.ClusterTask{}
|
|
|
|
|
|
clusterName, err := models.SharedNodeClusterDAO.FindNodeClusterName(tx, clusterId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
pbClusterTask.ClusterId = clusterId
|
|
|
|
|
|
pbClusterTask.ClusterName = clusterName
|
|
|
|
|
|
|
|
|
|
|
|
// 错误的节点任务
|
|
|
|
|
|
pbNodeTasks := []*pb.NodeTask{}
|
|
|
|
|
|
// TODO 考虑节点特别多的情形,比如只显示前100个
|
2021-08-08 15:47:48 +08:00
|
|
|
|
// TODO 支持NS节点
|
|
|
|
|
|
tasks, err := models.SharedNodeTaskDAO.FindAllDoingNodeTasksWithClusterId(tx, nodeconfigs.NodeRoleNode, clusterId)
|
2021-01-17 16:48:00 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
for _, task := range tasks {
|
|
|
|
|
|
// 节点
|
|
|
|
|
|
nodeName, err := models.SharedNodeDAO.FindNodeName(tx, int64(task.NodeId))
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 是否超时(N秒内没有更新)
|
|
|
|
|
|
if int64(task.UpdatedAt) < time.Now().Unix()-120 {
|
2022-03-22 22:11:32 +08:00
|
|
|
|
task.IsDone = true
|
|
|
|
|
|
task.IsOk = false
|
2021-01-17 16:48:00 +08:00
|
|
|
|
task.Error = "节点响应超时"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pbNodeTasks = append(pbNodeTasks, &pb.NodeTask{
|
|
|
|
|
|
Id: int64(task.Id),
|
|
|
|
|
|
Type: task.Type,
|
2022-03-22 22:11:32 +08:00
|
|
|
|
IsDone: task.IsDone,
|
|
|
|
|
|
IsOk: task.IsOk,
|
2021-01-17 16:48:00 +08:00
|
|
|
|
Error: task.Error,
|
|
|
|
|
|
UpdatedAt: int64(task.UpdatedAt),
|
2022-01-19 22:15:01 +08:00
|
|
|
|
ServerId: int64(task.ServerId),
|
2021-01-17 16:48:00 +08:00
|
|
|
|
Node: &pb.Node{
|
|
|
|
|
|
Id: int64(task.NodeId),
|
|
|
|
|
|
Name: nodeName,
|
|
|
|
|
|
},
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
pbClusterTask.NodeTasks = pbNodeTasks
|
|
|
|
|
|
|
|
|
|
|
|
pbClusterTasks = append(pbClusterTasks, pbClusterTask)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return &pb.FindNodeClusterTasksResponse{ClusterTasks: pbClusterTasks}, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-10 19:21:45 +08:00
|
|
|
|
// ExistsNodeTasks 检查是否有正在执行的任务
|
2021-01-17 16:48:00 +08:00
|
|
|
|
func (this *NodeTaskService) ExistsNodeTasks(ctx context.Context, req *pb.ExistsNodeTasksRequest) (*pb.ExistsNodeTasksResponse, error) {
|
|
|
|
|
|
_, err := this.ValidateAdmin(ctx, 0)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_ = req
|
|
|
|
|
|
|
|
|
|
|
|
var tx = this.NullTx()
|
|
|
|
|
|
|
|
|
|
|
|
// 是否有任务
|
2021-11-27 17:07:01 +08:00
|
|
|
|
existTask, err := models.SharedNodeTaskDAO.ExistsDoingNodeTasks(tx, nodeconfigs.NodeRoleNode, req.ExcludeTypes)
|
2021-01-17 16:48:00 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 是否有错误
|
2021-11-27 17:07:01 +08:00
|
|
|
|
existError, err := models.SharedNodeTaskDAO.ExistsErrorNodeTasks(tx, nodeconfigs.NodeRoleNode, req.ExcludeTypes)
|
2021-01-17 16:48:00 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return &pb.ExistsNodeTasksResponse{
|
|
|
|
|
|
ExistTasks: existTask,
|
|
|
|
|
|
ExistError: existError,
|
|
|
|
|
|
}, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-10 19:21:45 +08:00
|
|
|
|
// DeleteNodeTask 删除任务
|
2021-01-17 16:48:00 +08:00
|
|
|
|
func (this *NodeTaskService) DeleteNodeTask(ctx context.Context, req *pb.DeleteNodeTaskRequest) (*pb.RPCSuccess, error) {
|
|
|
|
|
|
_, err := this.ValidateAdmin(ctx, 0)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var tx = this.NullTx()
|
|
|
|
|
|
err = models.SharedNodeTaskDAO.DeleteNodeTask(tx, req.NodeTaskId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return this.Success()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-10 19:21:45 +08:00
|
|
|
|
// DeleteNodeTasks 批量删除任务
|
2021-02-02 20:52:59 +08:00
|
|
|
|
func (this *NodeTaskService) DeleteNodeTasks(ctx context.Context, req *pb.DeleteNodeTasksRequest) (*pb.RPCSuccess, error) {
|
|
|
|
|
|
_, err := this.ValidateAdmin(ctx, 0)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var tx = this.NullTx()
|
|
|
|
|
|
for _, taskId := range req.NodeTaskIds {
|
|
|
|
|
|
err = models.SharedNodeTaskDAO.DeleteNodeTask(tx, taskId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return this.Success()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-10 19:21:45 +08:00
|
|
|
|
// CountDoingNodeTasks 计算正在执行的任务数量
|
2021-01-17 16:48:00 +08:00
|
|
|
|
func (this *NodeTaskService) CountDoingNodeTasks(ctx context.Context, req *pb.CountDoingNodeTasksRequest) (*pb.RPCCountResponse, error) {
|
|
|
|
|
|
_, err := this.ValidateAdmin(ctx, 0)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_ = req
|
|
|
|
|
|
|
|
|
|
|
|
var tx = this.NullTx()
|
2021-08-08 15:47:48 +08:00
|
|
|
|
count, err := models.SharedNodeTaskDAO.CountDoingNodeTasks(tx, nodeconfigs.NodeRoleNode)
|
2021-01-17 16:48:00 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
return this.SuccessCount(count)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-10 19:21:45 +08:00
|
|
|
|
// FindNotifyingNodeTasks 查找需要通知的任务
|
2021-01-17 16:48:00 +08:00
|
|
|
|
func (this *NodeTaskService) FindNotifyingNodeTasks(ctx context.Context, req *pb.FindNotifyingNodeTasksRequest) (*pb.FindNotifyingNodeTasksResponse, error) {
|
|
|
|
|
|
_, err := this.ValidateAdmin(ctx, 0)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if req.Size <= 0 {
|
|
|
|
|
|
req.Size = 100
|
|
|
|
|
|
}
|
|
|
|
|
|
if req.Size > 1000 {
|
|
|
|
|
|
req.Size = 1000
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var tx = this.NullTx()
|
2021-08-08 15:47:48 +08:00
|
|
|
|
tasks, err := models.SharedNodeTaskDAO.FindNotifyingNodeTasks(tx, nodeconfigs.NodeRoleNode, req.Size)
|
2021-01-17 16:48:00 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pbTasks := []*pb.NodeTask{}
|
|
|
|
|
|
for _, task := range tasks {
|
|
|
|
|
|
pbTasks = append(pbTasks, &pb.NodeTask{
|
|
|
|
|
|
Id: int64(task.Id),
|
|
|
|
|
|
Type: task.Type,
|
2022-03-22 22:11:32 +08:00
|
|
|
|
IsDone: task.IsDone,
|
|
|
|
|
|
IsOk: task.IsOk,
|
2021-01-17 16:48:00 +08:00
|
|
|
|
Error: task.Error,
|
|
|
|
|
|
UpdatedAt: int64(task.UpdatedAt),
|
|
|
|
|
|
Node: &pb.Node{Id: int64(task.NodeId)},
|
2022-01-19 22:15:01 +08:00
|
|
|
|
ServerId: int64(task.ServerId),
|
2021-01-17 16:48:00 +08:00
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return &pb.FindNotifyingNodeTasksResponse{NodeTasks: pbTasks}, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-10 19:21:45 +08:00
|
|
|
|
// UpdateNodeTasksNotified 设置任务已通知
|
2021-01-17 16:48:00 +08:00
|
|
|
|
func (this *NodeTaskService) UpdateNodeTasksNotified(ctx context.Context, req *pb.UpdateNodeTasksNotifiedRequest) (*pb.RPCSuccess, error) {
|
|
|
|
|
|
_, err := this.ValidateAdmin(ctx, 0)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
err = this.RunTx(func(tx *dbs.Tx) error {
|
|
|
|
|
|
err = models.SharedNodeTaskDAO.UpdateTasksNotified(tx, req.NodeTaskIds)
|
|
|
|
|
|
return err
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return this.Success()
|
|
|
|
|
|
}
|