mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	删除集群的时候,同时删除对应的域名解析/集群切换二级域名先删除再添加新的域名解析
This commit is contained in:
		@@ -56,11 +56,13 @@ func (this *DNSTaskDAO) CreateDNSTask(tx *dbs.Tx, clusterId int64, serverId int6
 | 
				
			|||||||
		"isDone":     false,
 | 
							"isDone":     false,
 | 
				
			||||||
		"isOk":       false,
 | 
							"isOk":       false,
 | 
				
			||||||
		"error":      "",
 | 
							"error":      "",
 | 
				
			||||||
 | 
							"version":    time.Now().UnixNano(),
 | 
				
			||||||
	}, maps.Map{
 | 
						}, maps.Map{
 | 
				
			||||||
		"updatedAt": time.Now().Unix(),
 | 
							"updatedAt": time.Now().Unix(),
 | 
				
			||||||
		"isDone":    false,
 | 
							"isDone":    false,
 | 
				
			||||||
		"isOk":      false,
 | 
							"isOk":      false,
 | 
				
			||||||
		"error":     "",
 | 
							"error":     "",
 | 
				
			||||||
 | 
							"version":   time.Now().UnixNano(),
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	return err
 | 
						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) {
 | 
					func (this *DNSTaskDAO) FindAllDoingTasks(tx *dbs.Tx) (result []*DNSTask, err error) {
 | 
				
			||||||
	_, err = this.Query(tx).
 | 
						_, err = this.Query(tx).
 | 
				
			||||||
		Attr("isDone", 0).
 | 
							Attr("isDone", 0).
 | 
				
			||||||
 | 
							Asc("version").
 | 
				
			||||||
		AscPk().
 | 
							AscPk().
 | 
				
			||||||
		Slice(&result).
 | 
							Slice(&result).
 | 
				
			||||||
		FindAll()
 | 
							FindAll()
 | 
				
			||||||
@@ -109,6 +112,7 @@ func (this *DNSTaskDAO) FindAllDoingOrErrorTasks(tx *dbs.Tx, nodeClusterId int64
 | 
				
			|||||||
	_, err = query.
 | 
						_, err = query.
 | 
				
			||||||
		Where("(isDone=0 OR (isDone=1 AND isOk=0))").
 | 
							Where("(isDone=0 OR (isDone=1 AND isOk=0))").
 | 
				
			||||||
		Asc("updatedAt").
 | 
							Asc("updatedAt").
 | 
				
			||||||
 | 
							Asc("version").
 | 
				
			||||||
		AscPk().
 | 
							AscPk().
 | 
				
			||||||
		Slice(&result).
 | 
							Slice(&result).
 | 
				
			||||||
		FindAll()
 | 
							FindAll()
 | 
				
			||||||
@@ -163,3 +167,13 @@ func (this *DNSTaskDAO) UpdateDNSTaskDone(tx *dbs.Tx, taskId int64) error {
 | 
				
			|||||||
	op.Error = ""
 | 
						op.Error = ""
 | 
				
			||||||
	return this.Save(tx, op)
 | 
						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()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,20 +13,22 @@ type DNSTask struct {
 | 
				
			|||||||
	IsDone     bool   `field:"isDone"`     // 是否已完成
 | 
						IsDone     bool   `field:"isDone"`     // 是否已完成
 | 
				
			||||||
	IsOk       bool   `field:"isOk"`       // 是否成功
 | 
						IsOk       bool   `field:"isOk"`       // 是否成功
 | 
				
			||||||
	Error      string `field:"error"`      // 错误信息
 | 
						Error      string `field:"error"`      // 错误信息
 | 
				
			||||||
 | 
						Version    uint64 `field:"version"`    // 版本
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type DNSTaskOperator struct {
 | 
					type DNSTaskOperator struct {
 | 
				
			||||||
	Id         interface{} // ID
 | 
						Id         any // ID
 | 
				
			||||||
	ClusterId  interface{} // 集群ID
 | 
						ClusterId  any // 集群ID
 | 
				
			||||||
	ServerId   interface{} // 服务ID
 | 
						ServerId   any // 服务ID
 | 
				
			||||||
	NodeId     interface{} // 节点ID
 | 
						NodeId     any // 节点ID
 | 
				
			||||||
	DomainId   interface{} // 域名ID
 | 
						DomainId   any // 域名ID
 | 
				
			||||||
	RecordName interface{} // 记录名
 | 
						RecordName any // 记录名
 | 
				
			||||||
	Type       interface{} // 任务类型
 | 
						Type       any // 任务类型
 | 
				
			||||||
	UpdatedAt  interface{} // 更新时间
 | 
						UpdatedAt  any // 更新时间
 | 
				
			||||||
	IsDone     interface{} // 是否已完成
 | 
						IsDone     any // 是否已完成
 | 
				
			||||||
	IsOk       interface{} // 是否成功
 | 
						IsOk       any // 是否成功
 | 
				
			||||||
	Error      interface{} // 错误信息
 | 
						Error      any // 错误信息
 | 
				
			||||||
 | 
						Version    any // 版本
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewDNSTaskOperator() *DNSTaskOperator {
 | 
					func NewDNSTaskOperator() *DNSTaskOperator {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -466,7 +466,7 @@ func (this *NodeClusterDAO) FindClusterDNSInfo(tx *dbs.Tx, clusterId int64, cach
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	one, err := this.Query(tx).
 | 
						one, err := this.Query(tx).
 | 
				
			||||||
		Pk(clusterId).
 | 
							Pk(clusterId).
 | 
				
			||||||
		Result("id", "name", "dnsName", "dnsDomainId", "dns", "isOn").
 | 
							Result("id", "name", "dnsName", "dnsDomainId", "dns", "isOn", "state").
 | 
				
			||||||
		Find()
 | 
							Find()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -510,11 +510,17 @@ func (this *NodeClusterDAO) UpdateClusterDNS(tx *dbs.Tx, clusterId int64, dnsNam
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	var oldCluster = oldOne.(*NodeCluster)
 | 
						var oldCluster = oldOne.(*NodeCluster)
 | 
				
			||||||
	var oldDNSDomainId = int64(oldCluster.DnsDomainId)
 | 
						var oldDNSDomainId = int64(oldCluster.DnsDomainId)
 | 
				
			||||||
 | 
						var shouldRemoveOld = false
 | 
				
			||||||
	if (oldDNSDomainId > 0 && oldDNSDomainId != dnsDomainId) || (oldCluster.DnsName != dnsName) {
 | 
						if (oldDNSDomainId > 0 && oldDNSDomainId != dnsDomainId) || (oldCluster.DnsName != dnsName) {
 | 
				
			||||||
 | 
							if oldDNSDomainId == dnsDomainId {
 | 
				
			||||||
 | 
								// 如果只是换子域名,需要在新的域名添加之前,先删除老的子域名,防止无法添加CNAME
 | 
				
			||||||
			err = dns.SharedDNSTaskDAO.CreateClusterRemoveTask(tx, clusterId, oldDNSDomainId, oldCluster.DnsName)
 | 
								err = dns.SharedDNSTaskDAO.CreateClusterRemoveTask(tx, clusterId, oldDNSDomainId, oldCluster.DnsName)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								shouldRemoveOld = true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var op = NewNodeClusterOperator()
 | 
						var op = NewNodeClusterOperator()
 | 
				
			||||||
@@ -548,7 +554,20 @@ func (this *NodeClusterDAO) UpdateClusterDNS(tx *dbs.Tx, clusterId int64, dnsNam
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							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 查找集群所属管理员
 | 
					// FindClusterAdminId 查找集群所属管理员
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -143,18 +143,37 @@ func (this *NodeClusterService) DeleteNodeCluster(ctx context.Context, req *pb.D
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 删除集群
 | 
						// 删除现有的DNS相关任务
 | 
				
			||||||
	err = models.SharedNodeClusterDAO.DisableNodeCluster(tx, req.NodeClusterId)
 | 
						err = dns.SharedDNSTaskDAO.DeleteDNSTasksWithClusterId(tx, req.NodeClusterId)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							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)
 | 
						err = models.SharedNodeTaskDAO.DeleteAllClusterTasks(tx, nodeconfigs.NodeRoleNode, req.NodeClusterId)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 删除集群
 | 
				
			||||||
 | 
						err = models.SharedNodeClusterDAO.DisableNodeCluster(tx, req.NodeClusterId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return this.Success()
 | 
						return this.Success()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -525,11 +525,13 @@ func (this *DNSTaskExecutor) doClusterRemove(taskId int64, clusterId int64, doma
 | 
				
			|||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var tx *dbs.Tx
 | 
						var tx *dbs.Tx
 | 
				
			||||||
	if len(dnsName) == 0 {
 | 
					
 | 
				
			||||||
	dnsInfo, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(tx, clusterId, nil)
 | 
						dnsInfo, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(tx, clusterId, nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(dnsName) == 0 {
 | 
				
			||||||
		if dnsInfo == nil {
 | 
							if dnsInfo == nil {
 | 
				
			||||||
			isOk = true
 | 
								isOk = true
 | 
				
			||||||
			return nil
 | 
								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)
 | 
						domain, manager, err := this.findDNSManagerWithDomainId(tx, domainId)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user