From 5cac655f04cdbe95e55f3ec9ae3d4f461bb7a3d7 Mon Sep 17 00:00:00 2001 From: Matthew R Kasun Date: Mon, 6 Feb 2023 14:50:29 -0500 Subject: [PATCH] publish dns update on host name change --- controllers/hosts.go | 13 +++++++++++++ models/dnsEntry.go | 6 ++++-- mq/publishers.go | 29 +++++++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/controllers/hosts.go b/controllers/hosts.go index 05073599..d8d350e5 100644 --- a/controllers/hosts.go +++ b/controllers/hosts.go @@ -109,6 +109,19 @@ func updateHost(w http.ResponseWriter, r *http.Request) { if err := mq.PublishPeerUpdate(); err != nil { logger.Log(0, "fail to publish peer update: ", err.Error()) } + if newHost.Name != currHost.Name { + networks := logic.GetHostNetworks(currHost.ID.String()) + if err := mq.PublishHostDNSUpdate(currHost, newHost, networks); err != nil { + var dnsError *mq.DNSError + if errors.Is(err, dnsError) { + for _, message := range err.(mq.DNSError).ErrorStrings { + logger.Log(0, message) + } + } else { + logger.Log(0, err.Error()) + } + } + } }() apiHostData := newHost.ConvertNMHostToAPI() diff --git a/models/dnsEntry.go b/models/dnsEntry.go index e89ab3f7..d125db0c 100644 --- a/models/dnsEntry.go +++ b/models/dnsEntry.go @@ -4,15 +4,17 @@ package models type DNSUpdateAction int const ( - DNSDelete = iota + DNSDeleteByIP = iota DNSDeleteByName + DNSReplaceName + DNSReplaceByIP DNSInsert - DNSReplace ) type DNSUpdate struct { Action DNSUpdateAction Name string + NewName string Address string } diff --git a/mq/publishers.go b/mq/publishers.go index ca335c33..bf441894 100644 --- a/mq/publishers.go +++ b/mq/publishers.go @@ -240,7 +240,7 @@ func PublishAllDNS(newnode *models.Node) error { func PublishDNSDelete(node *models.Node, host *models.Host) error { dns := models.DNSUpdate{ - Action: models.DNSDelete, + Action: models.DNSDeleteByIP, Name: host.Name + "." + node.Network, } if node.Address.IP != nil { @@ -260,7 +260,7 @@ func PublishDNSDelete(node *models.Node, host *models.Host) error { func PublishReplaceDNS(oldNode, newNode *models.Node, host *models.Host) error { dns := models.DNSUpdate{ - Action: models.DNSReplace, + Action: models.DNSReplaceByIP, Name: host.Name + "." + oldNode.Network, } if !oldNode.Address.IP.Equal(newNode.Address.IP) { @@ -329,6 +329,31 @@ func PublishCustomDNS(entry *models.DNSEntry) error { return nil } +type DNSError struct { + ErrorStrings []string +} + +func (e DNSError) Error() string { + return "error publishing dns update" +} +func PublishHostDNSUpdate(old, new *models.Host, networks []string) error { + errors := DNSError{} + for _, network := range networks { + dns := models.DNSUpdate{ + Action: models.DNSReplaceName, + Name: old.Name + "." + network, + NewName: new.Name + "." + network, + } + if err := PublishDNSUpdate(network, dns); err != nil { + errors.ErrorStrings = append(errors.ErrorStrings, err.Error()) + } + } + if len(errors.ErrorStrings) > 0 { + return errors + } + return nil +} + // function to collect and store metrics for server nodes //func collectServerMetrics(networks []models.Network) { // if !servercfg.Is_EE {