Skip to content

Commit 18f74e5

Browse files
committed
update match domain to list
1 parent 3f2b480 commit 18f74e5

File tree

5 files changed

+111
-55
lines changed

5 files changed

+111
-55
lines changed

controllers/dns.go

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -95,17 +95,21 @@ func createNs(w http.ResponseWriter, r *http.Request) {
9595
"*": struct{}{},
9696
}
9797
}
98+
if req.MatchAll {
99+
req.MatchDomains = []string{"."}
100+
}
98101
ns := schema.Nameserver{
99-
ID: uuid.New().String(),
100-
Name: req.Name,
101-
NetworkID: req.NetworkID,
102-
Description: req.Description,
103-
MatchDomain: req.MatchDomain,
104-
Servers: req.Servers,
105-
Tags: req.Tags,
106-
Status: true,
107-
CreatedBy: r.Header.Get("user"),
108-
CreatedAt: time.Now().UTC(),
102+
ID: uuid.New().String(),
103+
Name: req.Name,
104+
NetworkID: req.NetworkID,
105+
Description: req.Description,
106+
MatchAll: req.MatchAll,
107+
MatchDomains: req.MatchDomains,
108+
Servers: req.Servers,
109+
Tags: req.Tags,
110+
Status: true,
111+
CreatedBy: r.Header.Get("user"),
112+
CreatedAt: time.Now().UTC(),
109113
}
110114

111115
err = ns.Create(db.WithContext(r.Context()))
@@ -187,7 +191,7 @@ func updateNs(w http.ResponseWriter, r *http.Request) {
187191
return
188192
}
189193

190-
if err := logic.ValidateUpdateNameserverReq(updateNs); err != nil {
194+
if err := logic.ValidateNameserverReq(updateNs); err != nil {
191195
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
192196
return
193197
}
@@ -202,9 +206,13 @@ func updateNs(w http.ResponseWriter, r *http.Request) {
202206
return
203207
}
204208
var updateStatus bool
209+
var updateMatchAll bool
205210
if updateNs.Status != ns.Status {
206211
updateStatus = true
207212
}
213+
if updateNs.MatchAll != ns.MatchAll {
214+
updateMatchAll = true
215+
}
208216
event := &models.Event{
209217
Action: models.Update,
210218
Source: models.Subject{
@@ -227,7 +235,8 @@ func updateNs(w http.ResponseWriter, r *http.Request) {
227235
}
228236
ns.Servers = updateNs.Servers
229237
ns.Tags = updateNs.Tags
230-
ns.MatchDomain = updateNs.MatchDomain
238+
ns.MatchDomains = updateNs.MatchDomains
239+
ns.MatchAll = updateNs.MatchAll
231240
ns.Description = updateNs.Description
232241
ns.Name = updateNs.Name
233242
ns.Status = updateNs.Status
@@ -245,6 +254,9 @@ func updateNs(w http.ResponseWriter, r *http.Request) {
245254
if updateStatus {
246255
ns.UpdateStatus(db.WithContext(context.TODO()))
247256
}
257+
if updateMatchAll {
258+
ns.UpdateMatchAll(db.WithContext(context.TODO()))
259+
}
248260
logic.LogEvent(event)
249261
go mq.PublishPeerUpdate(false)
250262
logic.ReturnSuccessResponseWithJson(w, r, ns, "updated nameserver")

logic/dns.go

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -375,22 +375,17 @@ func ValidateNameserverReq(ns schema.Nameserver) error {
375375
if len(ns.Servers) == 0 {
376376
return errors.New("atleast one nameserver should be specified")
377377
}
378-
if !IsValidMatchDomain(ns.MatchDomain) {
379-
return errors.New("invalid match domain")
378+
if !ns.MatchAll && len(ns.MatchDomains) == 0 {
379+
return errors.New("atleast one match domain is required")
380380
}
381-
return nil
382-
}
383-
384-
func ValidateUpdateNameserverReq(updateNs schema.Nameserver) error {
385-
if updateNs.Name == "" {
386-
return errors.New("name is required")
387-
}
388-
if len(updateNs.Servers) == 0 {
389-
return errors.New("atleast one nameserver should be specified")
390-
}
391-
if !IsValidMatchDomain(updateNs.MatchDomain) {
392-
return errors.New("invalid match domain")
381+
if !ns.MatchAll {
382+
for _, matchDomain := range ns.MatchDomains {
383+
if !IsValidMatchDomain(matchDomain) {
384+
return errors.New("invalid match domain")
385+
}
386+
}
393387
}
388+
394389
return nil
395390
}
396391

@@ -405,18 +400,22 @@ func GetNameserversForNode(node *models.Node) (returnNsLi []models.Nameserver) {
405400
}
406401
_, all := nsI.Tags["*"]
407402
if all {
408-
returnNsLi = append(returnNsLi, models.Nameserver{
409-
IPs: nsI.Servers,
410-
MatchDomain: nsI.MatchDomain,
411-
})
403+
for _, matchDomain := range nsI.MatchDomains {
404+
returnNsLi = append(returnNsLi, models.Nameserver{
405+
IPs: nsI.Servers,
406+
MatchDomain: matchDomain,
407+
})
408+
}
412409
continue
413410
}
414411
for tagI := range node.Tags {
415412
if _, ok := nsI.Tags[tagI.String()]; ok {
416-
returnNsLi = append(returnNsLi, models.Nameserver{
417-
IPs: nsI.Servers,
418-
MatchDomain: nsI.MatchDomain,
419-
})
413+
for _, matchDomain := range nsI.MatchDomains {
414+
returnNsLi = append(returnNsLi, models.Nameserver{
415+
IPs: nsI.Servers,
416+
MatchDomain: matchDomain,
417+
})
418+
}
420419
}
421420
}
422421
}
@@ -451,18 +450,23 @@ func GetNameserversForHost(h *models.Host) (returnNsLi []models.Nameserver) {
451450
}
452451
_, all := nsI.Tags["*"]
453452
if all {
454-
returnNsLi = append(returnNsLi, models.Nameserver{
455-
IPs: nsI.Servers,
456-
MatchDomain: nsI.MatchDomain,
457-
})
453+
for _, matchDomain := range nsI.MatchDomains {
454+
returnNsLi = append(returnNsLi, models.Nameserver{
455+
IPs: nsI.Servers,
456+
MatchDomain: matchDomain,
457+
})
458+
}
458459
continue
459460
}
460461
for tagI := range node.Tags {
461462
if _, ok := nsI.Tags[tagI.String()]; ok {
462-
returnNsLi = append(returnNsLi, models.Nameserver{
463-
IPs: nsI.Servers,
464-
MatchDomain: nsI.MatchDomain,
465-
})
463+
for _, matchDomain := range nsI.MatchDomains {
464+
returnNsLi = append(returnNsLi, models.Nameserver{
465+
IPs: nsI.Servers,
466+
MatchDomain: matchDomain,
467+
})
468+
}
469+
466470
}
467471
}
468472
}

migrate/migrate.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,35 @@ func Run() {
3737
updateAcls()
3838
logic.MigrateToGws()
3939
migrateToEgressV1()
40+
migrateNameservers()
4041
resync()
4142
}
4243

44+
func migrateNameservers() {
45+
nets, _ := logic.GetNetworks()
46+
for _, netI := range nets {
47+
if len(netI.NameServers) > 0 {
48+
ns := schema.Nameserver{
49+
ID: uuid.NewString(),
50+
Name: "upstream nameservers",
51+
NetworkID: netI.NetID,
52+
Servers: []string{},
53+
MatchAll: true,
54+
MatchDomains: []string{"."},
55+
Tags: datatypes.JSONMap{
56+
"*": struct{}{},
57+
},
58+
Status: true,
59+
CreatedBy: "auto",
60+
}
61+
for _, ip := range netI.NameServers {
62+
ns.Servers = append(ns.Servers, ip)
63+
}
64+
ns.Create(db.WithContext(context.TODO()))
65+
}
66+
}
67+
}
68+
4369
// removes if any stale configurations from previous run.
4470
func resync() {
4571

pro/logic/dns.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,15 @@ func ValidateNameserverReq(ns schema.Nameserver) error {
1818
if len(ns.Servers) == 0 {
1919
return errors.New("atleast one nameserver should be specified")
2020
}
21-
if !logic.IsValidMatchDomain(ns.MatchDomain) {
22-
return errors.New("invalid match domain")
21+
if !ns.MatchAll && len(ns.MatchDomains) == 0 {
22+
return errors.New("atleast one match domain is required")
23+
}
24+
if !ns.MatchAll {
25+
for _, matchDomain := range ns.MatchDomains {
26+
if !logic.IsValidMatchDomain(matchDomain) {
27+
return errors.New("invalid match domain")
28+
}
29+
}
2330
}
2431
if len(ns.Tags) > 0 {
2532
for tagI := range ns.Tags {

schema/dns.go

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,18 @@ import (
99
)
1010

1111
type Nameserver struct {
12-
ID string `gorm:"primaryKey" json:"id"`
13-
Name string `gorm:"name" json:"name"`
14-
NetworkID string `gorm:"network_id" json:"network_id"`
15-
Description string `gorm:"description" json:"description"`
16-
Servers datatypes.JSONSlice[string] `gorm:"servers" json:"servers"`
17-
MatchDomain string `gorm:"match_domain" json:"match_domain"`
18-
Tags datatypes.JSONMap `gorm:"tags" json:"tags"`
19-
Status bool `gorm:"status" json:"status"`
20-
CreatedBy string `gorm:"created_by" json:"created_by"`
21-
CreatedAt time.Time `gorm:"created_at" json:"created_at"`
22-
UpdatedAt time.Time `gorm:"updated_at" json:"updated_at"`
12+
ID string `gorm:"primaryKey" json:"id"`
13+
Name string `gorm:"name" json:"name"`
14+
NetworkID string `gorm:"network_id" json:"network_id"`
15+
Description string `gorm:"description" json:"description"`
16+
Servers datatypes.JSONSlice[string] `gorm:"servers" json:"servers"`
17+
MatchAll bool `gorm:"match_all" json:"match_all"`
18+
MatchDomains datatypes.JSONSlice[string] `gorm:"match_domains" json:"match_domains"`
19+
Tags datatypes.JSONMap `gorm:"tags" json:"tags"`
20+
Status bool `gorm:"status" json:"status"`
21+
CreatedBy string `gorm:"created_by" json:"created_by"`
22+
CreatedAt time.Time `gorm:"created_at" json:"created_at"`
23+
UpdatedAt time.Time `gorm:"updated_at" json:"updated_at"`
2324
}
2425

2526
func (ns *Nameserver) Get(ctx context.Context) error {
@@ -48,3 +49,9 @@ func (ns *Nameserver) UpdateStatus(ctx context.Context) error {
4849
"status": ns.Status,
4950
}).Error
5051
}
52+
53+
func (ns *Nameserver) UpdateMatchAll(ctx context.Context) error {
54+
return db.FromContext(ctx).Model(&Nameserver{}).Where("id = ?", ns.ID).Updates(map[string]any{
55+
"match_all": ns.MatchAll,
56+
}).Error
57+
}

0 commit comments

Comments
 (0)