Signed-off-by: Alejandro Mery <amery@jpi.io>
This commit is contained in:
2023-09-12 04:37:51 +00:00
parent 60d3a5f650
commit 8d1b9c4f04
10 changed files with 443 additions and 4 deletions
+86 -3
View File
@@ -1,6 +1,7 @@
package dns
import (
"fmt"
"net/netip"
"sort"
"time"
@@ -9,6 +10,14 @@ import (
"github.com/libdns/libdns"
)
// SortAddrSlice ...
func SortAddrSlice(s []netip.Addr) []netip.Addr {
sort.Slice(s, func(i, j int) bool {
return s[i].Less(s[j])
})
return s
}
// AddrRecord represents an A or AAAA record
type AddrRecord struct {
Name string
@@ -17,9 +26,7 @@ type AddrRecord struct {
// Sort sorts the addresses of the record
func (rr *AddrRecord) Sort() {
sort.Slice(rr.Addr, func(i, j int) bool {
return rr.Addr[i].Less(rr.Addr[j])
})
SortAddrSlice(rr.Addr)
}
// Export converts the record into libdns.Record
@@ -36,3 +43,79 @@ func (rr *AddrRecord) Export() []libdns.Record {
return out
}
func (mgr *Manager) genAllAddrRecords() []AddrRecord {
var out []AddrRecord
cache := make(map[string][]netip.Addr)
// zones
for _, z := range mgr.zones {
// machines
s := mgr.genZoneMachineRecords(z)
out = append(out, s...)
// zone alias
addrs := mgr.genZoneAddresses(z)
name := z.Name
out = append(out, AddrRecord{
Name: name + mgr.suffix,
Addr: addrs,
})
// and cache for regions
cache[name] = addrs
}
// regions
for name, zones := range mgr.regions {
var addrs []netip.Addr
for _, z := range zones {
addrs = append(addrs, cache[z]...)
}
rec := AddrRecord{
Name: name + mgr.suffix,
Addr: addrs,
}
rec.Sort()
out = append(out, rec)
}
// sort
sort.Slice(out, func(i, j int) bool {
return out[i].Name < out[j].Name
})
return out
}
func (*Manager) genZoneAddresses(z *Zone) []netip.Addr {
var out []netip.Addr
for _, p := range z.Machines {
if p.Active {
out = append(out, p.Addrs...)
}
}
SortAddrSlice(out)
return out
}
func (mgr *Manager) genZoneMachineRecords(z *Zone) []AddrRecord {
out := make([]AddrRecord, 0, len(z.Machines))
for _, p := range z.Machines {
rec := AddrRecord{
Name: fmt.Sprintf("%s-%v%s", z.Name, p.ID, mgr.suffix),
Addr: p.Addrs,
}
out = append(out, rec)
}
return out
}