diff --git a/internal/db/models/dns/dns_task_dao.go b/internal/db/models/dns/dns_task_dao.go index 5f6bee03..959a5030 100644 --- a/internal/db/models/dns/dns_task_dao.go +++ b/internal/db/models/dns/dns_task_dao.go @@ -74,8 +74,8 @@ func (this *DNSTaskDAO) CreateNodeTask(tx *dbs.Tx, nodeId int64, taskType DNSTas } // CreateServerTask 生成服务任务 -func (this *DNSTaskDAO) CreateServerTask(tx *dbs.Tx, serverId int64, taskType DNSTaskType) error { - return this.CreateDNSTask(tx, 0, serverId, 0, 0, taskType) +func (this *DNSTaskDAO) CreateServerTask(tx *dbs.Tx, clusterId int64, serverId int64, taskType DNSTaskType) error { + return this.CreateDNSTask(tx, clusterId, serverId, 0, 0, taskType) } // CreateDomainTask 生成域名更新任务 diff --git a/internal/db/models/server_dao.go b/internal/db/models/server_dao.go index 10553892..73a15f32 100644 --- a/internal/db/models/server_dao.go +++ b/internal/db/models/server_dao.go @@ -270,7 +270,7 @@ func (this *ServerDAO) CreateServer(tx *dbs.Tx, } // UpdateServerBasic 修改服务基本信息 -func (this *ServerDAO) UpdateServerBasic(tx *dbs.Tx, serverId int64, name string, description string, clusterId int64, keepOldChanges bool, isOn bool, groupIds []int64) error { +func (this *ServerDAO) UpdateServerBasic(tx *dbs.Tx, serverId int64, name string, description string, clusterId int64, keepOldConfigs bool, isOn bool, groupIds []int64) error { if serverId <= 0 { return errors.New("serverId should not be smaller than 0") } @@ -320,7 +320,7 @@ func (this *ServerDAO) UpdateServerBasic(tx *dbs.Tx, serverId int64, name string if clusterId != oldClusterId { // 服务配置更新 - if !keepOldChanges { + if !keepOldConfigs { err = this.NotifyClusterUpdate(tx, oldClusterId, serverId) if err != nil { return err @@ -328,7 +328,11 @@ func (this *ServerDAO) UpdateServerBasic(tx *dbs.Tx, serverId int64, name string } // DNS更新 - // TODO + // 这里不受 keepOldConfigs 的限制 + err = this.NotifyClusterDNSUpdate(tx, oldClusterId, serverId) + if err != nil { + return err + } } return nil @@ -2467,7 +2471,7 @@ func (this *ServerDAO) NotifyClusterUpdate(tx *dbs.Tx, clusterId, serverId int64 return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, serverId, NodeTaskTypeConfigChanged) } -// NotifyDNSUpdate 通知DNS更新 +// NotifyDNSUpdate 通知当前集群DNS更新 func (this *ServerDAO) NotifyDNSUpdate(tx *dbs.Tx, serverId int64) error { clusterId, err := this.Query(tx). Pk(serverId). @@ -2489,7 +2493,22 @@ func (this *ServerDAO) NotifyDNSUpdate(tx *dbs.Tx, serverId int64) error { if len(dnsInfo.DnsName) == 0 || dnsInfo.DnsDomainId <= 0 { return nil } - return dns.SharedDNSTaskDAO.CreateServerTask(tx, serverId, dns.DNSTaskTypeServerChange) + return dns.SharedDNSTaskDAO.CreateServerTask(tx, clusterId, serverId, dns.DNSTaskTypeServerChange) +} + +// NotifyClusterDNSUpdate 通知某个集群中的DNS更新 +func (this *ServerDAO) NotifyClusterDNSUpdate(tx *dbs.Tx, clusterId int64, serverId int64) error { + dnsInfo, err := SharedNodeClusterDAO.FindClusterDNSInfo(tx, clusterId, nil) + if err != nil { + return err + } + if dnsInfo == nil { + return nil + } + if len(dnsInfo.DnsName) == 0 || dnsInfo.DnsDomainId <= 0 { + return nil + } + return dns.SharedDNSTaskDAO.CreateServerTask(tx, clusterId, serverId, dns.DNSTaskTypeServerChange) } // NotifyDisable 通知禁用 diff --git a/internal/tasks/dns_task_executor.go b/internal/tasks/dns_task_executor.go index 6f0b299a..3934b68e 100644 --- a/internal/tasks/dns_task_executor.go +++ b/internal/tasks/dns_task_executor.go @@ -64,7 +64,7 @@ func (this *DNSTaskExecutor) Loop() error { taskId := int64(task.Id) switch task.Type { case dnsmodels.DNSTaskTypeServerChange: - err = this.doServer(taskId, int64(task.ServerId)) + err = this.doServer(taskId, int64(task.ClusterId), int64(task.ServerId)) if err != nil { err = dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskError(nil, taskId, err.Error()) if err != nil { @@ -88,7 +88,7 @@ func (this *DNSTaskExecutor) Loop() error { } } case dnsmodels.DNSTaskTypeDomainChange: - err = this.doDomain(taskId, int64(task.DomainId)) + err = this.doDomainWithTask(taskId, int64(task.DomainId)) if err != nil { err = dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskError(nil, taskId, err.Error()) if err != nil { @@ -102,7 +102,7 @@ func (this *DNSTaskExecutor) Loop() error { } // 修改服务相关记录 -func (this *DNSTaskExecutor) doServer(taskId int64, serverId int64) error { +func (this *DNSTaskExecutor) doServer(taskId int64, oldClusterId int64, serverId int64) error { var tx *dbs.Tx isOk := false @@ -129,6 +129,41 @@ func (this *DNSTaskExecutor) doServer(taskId int64, serverId int64) error { return nil } + var recordName = serverDNS.DnsName + var recordType = dnstypes.RecordTypeCNAME + + // 如果集群发生了变化,则从老的集群中删除 + if oldClusterId > 0 && int64(serverDNS.ClusterId) != oldClusterId { + oldManager, oldDomainId, oldDomain, _, _, err := this.findDNSManager(tx, oldClusterId) + if err != nil { + return err + } + if oldManager != nil { + oldRecord, err := oldManager.QueryRecord(oldDomain, recordName, recordType) + if err != nil { + return err + } + if oldRecord != nil { + // 删除记录 + err = oldManager.DeleteRecord(oldDomain, oldRecord) + if err != nil { + return err + } + + // 更新域名中记录缓存 + // 这里不创建域名更新任务,而是直接更新,避免影响其他任务的执行 + err = this.doDomain(oldDomainId) + if err != nil { + return err + } + } + } + + isOk = true + return nil + } + + // 处理新的集群 manager, domainId, domain, clusterDNSName, dnsConfig, err := this.findDNSManager(tx, int64(serverDNS.ClusterId)) if err != nil { return err @@ -142,10 +177,8 @@ func (this *DNSTaskExecutor) doServer(taskId int64, serverId int64) error { ttl = dnsConfig.TTL } - recordName := serverDNS.DnsName recordValue := clusterDNSName + "." + domain + "." recordRoute := manager.DefaultRoute() - recordType := dnstypes.RecordTypeCNAME if serverDNS.State == models.ServerStateDisabled || !serverDNS.IsOn { // 检查记录是否已经存在 record, err := manager.QueryRecord(domain, recordName, recordType) @@ -466,15 +499,21 @@ func (this *DNSTaskExecutor) doCluster(taskId int64, clusterId int64) error { return nil } -func (this *DNSTaskExecutor) doDomain(taskId int64, domainId int64) error { +func (this *DNSTaskExecutor) doDomain(domainId int64) error { + return this.doDomainWithTask(0, domainId) +} + +func (this *DNSTaskExecutor) doDomainWithTask(taskId int64, domainId int64) error { var tx *dbs.Tx isOk := false defer func() { if isOk { - err := dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskDone(tx, taskId) - if err != nil { - remotelogs.Error("DNSTaskExecutor", err.Error()) + if taskId > 0 { + err := dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskDone(tx, taskId) + if err != nil { + remotelogs.Error("DNSTaskExecutor", err.Error()) + } } } }()