删除集群的时候,同时删除对应的域名解析/集群切换二级域名先删除再添加新的域名解析

This commit is contained in:
GoEdgeLab
2022-09-22 14:09:28 +08:00
parent d4a1c86b93
commit ce9bf28274
5 changed files with 84 additions and 22 deletions

View File

@@ -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()
}

View File

@@ -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 {

View File

@@ -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 查找集群所属管理员

View File

@@ -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()
} }

View File

@@ -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