diff --git a/internal/db/models/dns/dns_task_dao.go b/internal/db/models/dns/dns_task_dao.go index cf9ae302..c433e079 100644 --- a/internal/db/models/dns/dns_task_dao.go +++ b/internal/db/models/dns/dns_task_dao.go @@ -56,11 +56,13 @@ func (this *DNSTaskDAO) CreateDNSTask(tx *dbs.Tx, clusterId int64, serverId int6 "isDone": false, "isOk": false, "error": "", + "version": time.Now().UnixNano(), }, maps.Map{ "updatedAt": time.Now().Unix(), "isDone": false, "isOk": false, "error": "", + "version": time.Now().UnixNano(), }) return err } @@ -94,6 +96,7 @@ func (this *DNSTaskDAO) CreateDomainTask(tx *dbs.Tx, domainId int64, taskType DN func (this *DNSTaskDAO) FindAllDoingTasks(tx *dbs.Tx) (result []*DNSTask, err error) { _, err = this.Query(tx). Attr("isDone", 0). + Asc("version"). AscPk(). Slice(&result). FindAll() @@ -109,6 +112,7 @@ func (this *DNSTaskDAO) FindAllDoingOrErrorTasks(tx *dbs.Tx, nodeClusterId int64 _, err = query. Where("(isDone=0 OR (isDone=1 AND isOk=0))"). Asc("updatedAt"). + Asc("version"). AscPk(). Slice(&result). FindAll() @@ -163,3 +167,13 @@ func (this *DNSTaskDAO) UpdateDNSTaskDone(tx *dbs.Tx, taskId int64) error { op.Error = "" return this.Save(tx, op) } + +// DeleteDNSTasksWithClusterId 删除集群相关任务 +func (this *DNSTaskDAO) DeleteDNSTasksWithClusterId(tx *dbs.Tx, clusterId int64) error { + if clusterId <= 0 { + return nil + } + return this.Query(tx). + Attr("clusterId", clusterId). + DeleteQuickly() +} diff --git a/internal/db/models/dns/dns_task_model.go b/internal/db/models/dns/dns_task_model.go index f04dd952..f1108b44 100644 --- a/internal/db/models/dns/dns_task_model.go +++ b/internal/db/models/dns/dns_task_model.go @@ -13,20 +13,22 @@ type DNSTask struct { IsDone bool `field:"isDone"` // 是否已完成 IsOk bool `field:"isOk"` // 是否成功 Error string `field:"error"` // 错误信息 + Version uint64 `field:"version"` // 版本 } type DNSTaskOperator struct { - Id interface{} // ID - ClusterId interface{} // 集群ID - ServerId interface{} // 服务ID - NodeId interface{} // 节点ID - DomainId interface{} // 域名ID - RecordName interface{} // 记录名 - Type interface{} // 任务类型 - UpdatedAt interface{} // 更新时间 - IsDone interface{} // 是否已完成 - IsOk interface{} // 是否成功 - Error interface{} // 错误信息 + Id any // ID + ClusterId any // 集群ID + ServerId any // 服务ID + NodeId any // 节点ID + DomainId any // 域名ID + RecordName any // 记录名 + Type any // 任务类型 + UpdatedAt any // 更新时间 + IsDone any // 是否已完成 + IsOk any // 是否成功 + Error any // 错误信息 + Version any // 版本 } func NewDNSTaskOperator() *DNSTaskOperator { diff --git a/internal/db/models/node_cluster_dao.go b/internal/db/models/node_cluster_dao.go index 8c4359e7..2883d3eb 100644 --- a/internal/db/models/node_cluster_dao.go +++ b/internal/db/models/node_cluster_dao.go @@ -466,7 +466,7 @@ func (this *NodeClusterDAO) FindClusterDNSInfo(tx *dbs.Tx, clusterId int64, cach one, err := this.Query(tx). Pk(clusterId). - Result("id", "name", "dnsName", "dnsDomainId", "dns", "isOn"). + Result("id", "name", "dnsName", "dnsDomainId", "dns", "isOn", "state"). Find() if err != nil { return nil, err @@ -510,10 +510,16 @@ func (this *NodeClusterDAO) UpdateClusterDNS(tx *dbs.Tx, clusterId int64, dnsNam var oldCluster = oldOne.(*NodeCluster) var oldDNSDomainId = int64(oldCluster.DnsDomainId) + var shouldRemoveOld = false if (oldDNSDomainId > 0 && oldDNSDomainId != dnsDomainId) || (oldCluster.DnsName != dnsName) { - err = dns.SharedDNSTaskDAO.CreateClusterRemoveTask(tx, clusterId, oldDNSDomainId, oldCluster.DnsName) - if err != nil { - return err + if oldDNSDomainId == dnsDomainId { + // 如果只是换子域名,需要在新的域名添加之前,先删除老的子域名,防止无法添加CNAME + err = dns.SharedDNSTaskDAO.CreateClusterRemoveTask(tx, clusterId, oldDNSDomainId, oldCluster.DnsName) + if err != nil { + return err + } + } else { + shouldRemoveOld = true } } @@ -548,7 +554,20 @@ func (this *NodeClusterDAO) UpdateClusterDNS(tx *dbs.Tx, clusterId int64, dnsNam if err != nil { return err } - return this.NotifyDNSUpdate(tx, clusterId) + err = this.NotifyDNSUpdate(tx, clusterId) + if err != nil { + return err + } + + // 删除老的记录 + if shouldRemoveOld { + err = dns.SharedDNSTaskDAO.CreateClusterRemoveTask(tx, clusterId, oldDNSDomainId, oldCluster.DnsName) + if err != nil { + return err + } + } + + return nil } // FindClusterAdminId 查找集群所属管理员 diff --git a/internal/rpc/services/service_node_cluster.go b/internal/rpc/services/service_node_cluster.go index 5ea42037..7b1ec4d5 100644 --- a/internal/rpc/services/service_node_cluster.go +++ b/internal/rpc/services/service_node_cluster.go @@ -143,18 +143,37 @@ func (this *NodeClusterService) DeleteNodeCluster(ctx context.Context, req *pb.D return nil, err } - // 删除集群 - err = models.SharedNodeClusterDAO.DisableNodeCluster(tx, req.NodeClusterId) + // 删除现有的DNS相关任务 + err = dns.SharedDNSTaskDAO.DeleteDNSTasksWithClusterId(tx, req.NodeClusterId) if err != nil { return nil, err } + // 生成新的删除DNS任务 + dnsInfo, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(tx, req.NodeClusterId, nil) + if err != nil { + return nil, err + } + if dnsInfo != nil { + var oldDNSDomainId = int64(dnsInfo.DnsDomainId) + err = dns.SharedDNSTaskDAO.CreateClusterRemoveTask(tx, req.NodeClusterId, oldDNSDomainId, dnsInfo.DnsName) + if err != nil { + return nil, err + } + } + // 删除相关任务 err = models.SharedNodeTaskDAO.DeleteAllClusterTasks(tx, nodeconfigs.NodeRoleNode, req.NodeClusterId) if err != nil { return nil, err } + // 删除集群 + err = models.SharedNodeClusterDAO.DisableNodeCluster(tx, req.NodeClusterId) + if err != nil { + return nil, err + } + return this.Success() } diff --git a/internal/tasks/dns_task_executor.go b/internal/tasks/dns_task_executor.go index 535d8755..63a46837 100644 --- a/internal/tasks/dns_task_executor.go +++ b/internal/tasks/dns_task_executor.go @@ -525,11 +525,13 @@ func (this *DNSTaskExecutor) doClusterRemove(taskId int64, clusterId int64, doma }() var tx *dbs.Tx + + dnsInfo, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(tx, clusterId, nil) + if err != nil { + return err + } + if len(dnsName) == 0 { - dnsInfo, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(tx, clusterId, nil) - if err != nil { - return err - } if dnsInfo == nil { isOk = true return nil @@ -541,6 +543,12 @@ func (this *DNSTaskExecutor) doClusterRemove(taskId int64, clusterId int64, doma } } + // 再次检查是否正在使用,如果正在使用,则直接返回 + if dnsInfo != nil && dnsInfo.State == models.NodeClusterStateEnabled /** 尚未被删除 **/ && int64(dnsInfo.DnsDomainId) == domainId && dnsInfo.DnsName == dnsName { + isOk = true + return nil + } + domain, manager, err := this.findDNSManagerWithDomainId(tx, domainId) if err != nil { return err