add nameservers to peer update

This commit is contained in:
abhishek9686 2025-08-21 15:55:33 +05:30
parent dcd7fe72dd
commit 1b563b9483
9 changed files with 63 additions and 9 deletions

View file

@ -43,7 +43,7 @@ func dnsHandlers(r *mux.Router) {
r.HandleFunc("/api/v1/nameserver", logic.SecurityCheck(true, http.HandlerFunc(createNs))).Methods(http.MethodPost)
r.HandleFunc("/api/v1/nameserver", logic.SecurityCheck(true, http.HandlerFunc(listNs))).Methods(http.MethodGet)
r.HandleFunc("/api/v1/nameserver", logic.SecurityCheck(true, http.HandlerFunc(updateNs))).Methods(http.MethodPut)
r.HandleFunc("/api/v1/nameserver", logic.SecurityCheck(true, http.HandlerFunc(deleteEgress))).Methods(http.MethodDelete)
r.HandleFunc("/api/v1/nameserver", logic.SecurityCheck(true, http.HandlerFunc(deleteNs))).Methods(http.MethodDelete)
}
// @Summary Create Nameserver
@ -79,7 +79,7 @@ func createNs(w http.ResponseWriter, r *http.Request) {
ns := schema.Nameserver{
ID: uuid.New().String(),
Name: req.Name,
Network: req.Network,
NetworkID: req.Network,
Description: req.Description,
MatchDomain: req.MatchDomain,
Servers: req.Servers,
@ -111,7 +111,7 @@ func createNs(w http.ResponseWriter, r *http.Request) {
Name: ns.Name,
Type: models.NameserverSub,
},
NetworkID: models.NetworkID(ns.Network),
NetworkID: models.NetworkID(ns.NetworkID),
Origin: models.Dashboard,
})
@ -135,13 +135,13 @@ func listNs(w http.ResponseWriter, r *http.Request) {
logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("network is required"), "badrequest"))
return
}
ns := schema.Nameserver{Network: network}
ns := schema.Nameserver{NetworkID: network}
list, err := ns.ListByNetwork(db.WithContext(r.Context()))
if err != nil {
logic.ReturnErrorResponse(
w,
r,
logic.FormatError(errors.New("error listing egress resource"+err.Error()), "internal"),
logic.FormatError(errors.New("error listing nameservers "+err.Error()), "internal"),
)
return
}
@ -203,7 +203,7 @@ func updateNs(w http.ResponseWriter, r *http.Request) {
Old: ns,
New: updateNs,
},
NetworkID: models.NetworkID(ns.Network),
NetworkID: models.NetworkID(ns.NetworkID),
Origin: models.Dashboard,
}
ns.Servers = updateNs.Servers
@ -270,7 +270,7 @@ func deleteNs(w http.ResponseWriter, r *http.Request) {
Name: ns.Name,
Type: models.NameserverSub,
},
NetworkID: models.NetworkID(ns.Network),
NetworkID: models.NetworkID(ns.NetworkID),
Origin: models.Dashboard,
})

View file

@ -245,6 +245,7 @@ func pull(w http.ResponseWriter, r *http.Request) {
DefaultGwIp: hPU.DefaultGwIp,
IsInternetGw: hPU.IsInternetGw,
EndpointDetection: logic.IsEndpointDetectionEnabled(),
DnsNameservers: hPU.DnsNameservers,
}
logger.Log(1, hostID, "completed a pull")

View file

@ -1,6 +1,7 @@
package logic
import (
"context"
"encoding/json"
"errors"
"fmt"
@ -11,6 +12,7 @@ import (
validator "github.com/go-playground/validator/v10"
"github.com/gravitl/netmaker/database"
"github.com/gravitl/netmaker/db"
"github.com/gravitl/netmaker/logger"
"github.com/gravitl/netmaker/models"
"github.com/gravitl/netmaker/schema"
@ -332,6 +334,9 @@ func ValidateNameserverReq(ns models.NameserverReq) error {
if ns.Name == "" {
return errors.New("name is required")
}
if ns.Network == "" {
return errors.New("network is required")
}
if len(ns.Servers) == 0 {
return errors.New("atleast one nameserver should be specified")
}
@ -354,6 +359,44 @@ func ValidateUpdateNameserverReq(updateNs schema.Nameserver) error {
return nil
}
func GetNameserversForHost(h *models.Host) (returnNsLi []models.Nameserver) {
if h.DNS != "yes" {
return
}
for _, nodeID := range h.Nodes {
node, err := GetNodeByID(nodeID)
if err != nil {
continue
}
ns := &schema.Nameserver{
NetworkID: node.Network,
}
nsLi, _ := ns.ListByNetwork(db.WithContext(context.TODO()))
for _, nsI := range nsLi {
if !nsI.Status {
continue
}
_, all := nsI.Tags["*"]
if all {
returnNsLi = append(returnNsLi, models.Nameserver{
IPs: ns.Servers,
MatchDomain: ns.MatchDomain,
})
continue
}
for tagI := range node.Tags {
if _, ok := nsI.Tags[tagI.String()]; ok {
returnNsLi = append(returnNsLi, models.Nameserver{
IPs: ns.Servers,
MatchDomain: ns.MatchDomain,
})
}
}
}
}
return
}
// IsValidMatchDomain reports whether s is a valid "match domain".
// Rules (simple/ASCII):
// - "~." is allowed (match all).

View file

@ -142,6 +142,7 @@ func GetPeerUpdateForHost(network string, host *models.Host, allNodes []models.N
NodePeers: []wgtypes.PeerConfig{},
HostNetworkInfo: models.HostInfoMap{},
ServerConfig: GetServerInfo(),
DnsNameservers: GetNameserversForHost(host),
}
if host.DNS == "no" {
hostPeerUpdate.ManageDNS = false

View file

@ -28,10 +28,16 @@ type HostPeerUpdate struct {
FwUpdate FwUpdate `json:"fw_update"`
ReplacePeers bool `json:"replace_peers"`
NameServers []string `json:"name_servers"`
DnsNameservers []Nameserver `json:"dns_nameservers"`
ServerConfig
OldPeerUpdateFields
}
type Nameserver struct {
IPs []string `json:"ips"`
MatchDomain string `json:"match_domain"`
}
type OldPeerUpdateFields struct {
NodePeers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"`
OldPeers []wgtypes.PeerConfig `json:"Peers"`

View file

@ -254,6 +254,7 @@ type HostPull struct {
DefaultGwIp net.IP `json:"default_gw_ip"`
IsInternetGw bool `json:"is_inet_gw"`
EndpointDetection bool `json:"endpoint_detection"`
DnsNameservers []Nameserver `json:"dns_nameservers"`
}
type DefaultGwInfo struct {

View file

@ -113,6 +113,7 @@ func PublishSingleHostPeerUpdate(host *models.Host, allNodes []models.Node, dele
if err != nil {
return err
}
for _, nodeID := range host.Nodes {
node, err := logic.GetNodeByID(nodeID)

View file

@ -11,7 +11,7 @@ import (
type Nameserver struct {
ID string `gorm:"primaryKey" json:"id"`
Name string `gorm:"name" json:"name"`
Network string `gorm:"network" json:"network"`
NetworkID string `gorm:"network_id" json:"network_id"`
Description string `gorm:"description" json:"description"`
Servers datatypes.JSONSlice[string] `gorm:"servers" json:"servers"`
MatchDomain string `gorm:"match_domain" json:"match_domain"`
@ -35,7 +35,7 @@ func (ns *Nameserver) Create(ctx context.Context) error {
}
func (ns *Nameserver) ListByNetwork(ctx context.Context) (dnsli []Nameserver, err error) {
err = db.FromContext(ctx).Model(&Nameserver{}).Where("network_id = ?", ns.Network).Find(&dnsli).Error
err = db.FromContext(ctx).Model(&Nameserver{}).Where("network_id = ?", ns.NetworkID).Find(&dnsli).Error
return
}

View file

@ -7,5 +7,6 @@ func ListModels() []interface{} {
&Egress{},
&UserAccessToken{},
&Event{},
&Nameserver{},
}
}