mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-05-11 05:55:12 +00:00
CORE: Clean up diff2 code in prep for production (#2104)
This commit is contained in:
@ -128,7 +128,6 @@ func (a *edgeDNSProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mode
|
||||
keysToUpdate, err = (diff.New(dc)).ChangedGroups(existingRecords)
|
||||
} else {
|
||||
keysToUpdate, err = (diff.NewCompat(dc)).ChangedGroups(existingRecords)
|
||||
// TODO(tlim): In the future please adopt `pkg/diff2/By*()`
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -14,6 +14,7 @@ import (
|
||||
"github.com/StackExchange/dnscontrol/v3/pkg/transform"
|
||||
"github.com/StackExchange/dnscontrol/v3/providers"
|
||||
"github.com/cloudflare/cloudflare-go"
|
||||
"github.com/fatih/color"
|
||||
"github.com/miekg/dns/dnsutil"
|
||||
)
|
||||
|
||||
@ -415,6 +416,17 @@ func (c *cloudflareProvider) mkCreateCorrection(newrec *models.RecordConfig, dom
|
||||
}
|
||||
|
||||
func (c *cloudflareProvider) mkChangeCorrection(oldrec, newrec *models.RecordConfig, domainID string, msg string) []*models.Correction {
|
||||
var idTxt string
|
||||
switch oldrec.Type {
|
||||
case "PAGE_RULE":
|
||||
idTxt = oldrec.Original.(cloudflare.PageRule).ID
|
||||
case "WORKER_ROUTE":
|
||||
idTxt = oldrec.Original.(cloudflare.WorkerRoute).ID
|
||||
default:
|
||||
idTxt = oldrec.Original.(cloudflare.DNSRecord).ID
|
||||
}
|
||||
msg = msg + color.YellowString(" id=%v", idTxt)
|
||||
|
||||
switch newrec.Type {
|
||||
case "PAGE_RULE":
|
||||
return []*models.Correction{{
|
||||
@ -441,6 +453,7 @@ func (c *cloudflareProvider) mkChangeCorrection(oldrec, newrec *models.RecordCon
|
||||
}
|
||||
|
||||
func (c *cloudflareProvider) mkDeleteCorrection(recType string, origRec any, domainID string, msg string) []*models.Correction {
|
||||
|
||||
var idTxt string
|
||||
switch recType {
|
||||
case "PAGE_RULE":
|
||||
@ -450,7 +463,7 @@ func (c *cloudflareProvider) mkDeleteCorrection(recType string, origRec any, dom
|
||||
default:
|
||||
idTxt = origRec.(cloudflare.DNSRecord).ID
|
||||
}
|
||||
msg = msg + fmt.Sprintf(" id=%v", idTxt)
|
||||
msg = msg + color.RedString(" id=%v", idTxt)
|
||||
|
||||
correction := &models.Correction{
|
||||
Msg: msg,
|
||||
|
@ -118,42 +118,18 @@ func (client *providerClient) GenerateDomainCorrections(dc *models.DomainConfig,
|
||||
//txtutil.SplitSingleLongTxt(dc.Records) // Autosplit long TXT records
|
||||
|
||||
var corrections []*models.Correction
|
||||
var creates, dels, modifications diff.Changeset
|
||||
var err error
|
||||
var differ diff.Differ
|
||||
if !diff2.EnableDiff2 {
|
||||
differ := diff.New(dc)
|
||||
_, creates, dels, modifications, err = differ.IncrementalDiff(foundRecords)
|
||||
differ = diff.New(dc)
|
||||
} else {
|
||||
differ := diff.NewCompat(dc)
|
||||
_, creates, dels, modifications, err = differ.IncrementalDiff(foundRecords)
|
||||
differ = diff.NewCompat(dc)
|
||||
}
|
||||
_, creates, dels, modifications, err := differ.IncrementalDiff(foundRecords)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// How to generate corrections?
|
||||
|
||||
// (1) Most providers take individual deletes, creates, and
|
||||
// modifications:
|
||||
|
||||
// // Generate changes.
|
||||
// corrections := []*models.Correction{}
|
||||
// for _, del := range dels {
|
||||
// corrections = append(corrections, client.deleteRec(client.dnsserver, dc.Name, del))
|
||||
// }
|
||||
// for _, cre := range creates {
|
||||
// corrections = append(corrections, client.createRec(client.dnsserver, dc.Name, cre)...)
|
||||
// }
|
||||
// for _, m := range modifications {
|
||||
// corrections = append(corrections, client.modifyRec(client.dnsserver, dc.Name, m))
|
||||
// }
|
||||
// return corrections, nil
|
||||
|
||||
// (2) Some providers upload the entire zone every time. Look at
|
||||
// GetDomainCorrections for BIND and NAMECHEAP for inspiration.
|
||||
|
||||
// (3) Others do something entirely different. Like CSCGlobal:
|
||||
|
||||
// CSCGlobal has a unique API. A list of edits is sent in one API
|
||||
// call. Edits aren't permitted if an existing edit is being
|
||||
// processed. Therefore, before we do an edit we block until the
|
||||
|
@ -147,20 +147,19 @@ func (api *digitaloceanProvider) GetDomainCorrections(dc *models.DomainConfig) (
|
||||
txtutil.SplitSingleLongTxt(dc.Records) // Autosplit long TXT records
|
||||
|
||||
var corrections []*models.Correction
|
||||
var create, delete, modify diff.Changeset
|
||||
var differ diff.Differ
|
||||
if !diff2.EnableDiff2 {
|
||||
differ := diff.New(dc)
|
||||
_, create, delete, modify, err = differ.IncrementalDiff(existingRecords)
|
||||
differ = diff.New(dc)
|
||||
} else {
|
||||
differ := diff.NewCompat(dc)
|
||||
_, create, delete, modify, err = differ.IncrementalDiff(existingRecords)
|
||||
differ = diff.NewCompat(dc)
|
||||
}
|
||||
_, toCreate, toDelete, toModify, err := differ.IncrementalDiff(existingRecords)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Deletes first so changing type works etc.
|
||||
for _, m := range delete {
|
||||
for _, m := range toDelete {
|
||||
id := m.Existing.Original.(*godo.DomainRecord).ID
|
||||
corr := &models.Correction{
|
||||
Msg: fmt.Sprintf("%s, DO ID: %d", m.String(), id),
|
||||
@ -177,7 +176,7 @@ func (api *digitaloceanProvider) GetDomainCorrections(dc *models.DomainConfig) (
|
||||
}
|
||||
corrections = append(corrections, corr)
|
||||
}
|
||||
for _, m := range create {
|
||||
for _, m := range toCreate {
|
||||
req := toReq(dc, m.Desired)
|
||||
corr := &models.Correction{
|
||||
Msg: m.String(),
|
||||
@ -194,7 +193,7 @@ func (api *digitaloceanProvider) GetDomainCorrections(dc *models.DomainConfig) (
|
||||
}
|
||||
corrections = append(corrections, corr)
|
||||
}
|
||||
for _, m := range modify {
|
||||
for _, m := range toModify {
|
||||
id := m.Existing.Original.(*godo.DomainRecord).ID
|
||||
req := toReq(dc, m.Desired)
|
||||
corr := &models.Correction{
|
||||
@ -281,7 +280,7 @@ func toRc(domain string, r *godo.DomainRecord) *models.RecordConfig {
|
||||
t.SetTarget(target)
|
||||
switch rtype := r.Type; rtype {
|
||||
case "TXT":
|
||||
t.SetTargetTXTString(target)
|
||||
t.SetTargetTXTfromRFC1035Quoted(target)
|
||||
default:
|
||||
// nothing additional required
|
||||
}
|
||||
|
@ -177,10 +177,6 @@ func (c *dnsimpleProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mod
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, del := range del {
|
||||
rec := del.Existing.Original.(dnsimpleapi.ZoneRecord)
|
||||
corrections = append(corrections, &models.Correction{
|
||||
|
@ -366,6 +366,8 @@ func (client *gandiv5Provider) GenerateDomainCorrections(dc *models.DomainConfig
|
||||
|
||||
case diff2.CREATE:
|
||||
// We have to create the label one rtype at a time.
|
||||
// In other words, this is a ByRecordSet API for creation, even though
|
||||
// this is a ByLabel() API for everything else.
|
||||
natives := recordsToNative(inst.New, dc.Name)
|
||||
for _, n := range natives {
|
||||
label := inst.Key.NameFQDN
|
||||
|
@ -213,26 +213,22 @@ func (g *gcloudProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*model
|
||||
differ = diff.NewCompat(dc)
|
||||
}
|
||||
_, create, delete, modify, err := differ.IncrementalDiff(existingRecords)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("incdiff error: %w", err)
|
||||
}
|
||||
|
||||
changedKeys := map[key]bool{}
|
||||
desc := ""
|
||||
var msgs []string
|
||||
for _, c := range create {
|
||||
desc += fmt.Sprintln(c)
|
||||
msgs = append(msgs, fmt.Sprint(c))
|
||||
changedKeys[keyForRec(c.Desired)] = true
|
||||
}
|
||||
for _, d := range delete {
|
||||
desc += fmt.Sprintln(d)
|
||||
msgs = append(msgs, fmt.Sprint(d))
|
||||
changedKeys[keyForRec(d.Existing)] = true
|
||||
}
|
||||
for _, m := range modify {
|
||||
desc += fmt.Sprintln(m)
|
||||
msgs = append(msgs, fmt.Sprint(m))
|
||||
changedKeys[keyForRec(m.Existing)] = true
|
||||
}
|
||||
if len(changedKeys) == 0 {
|
||||
@ -282,7 +278,7 @@ func (g *gcloudProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*model
|
||||
}
|
||||
|
||||
return []*models.Correction{{
|
||||
Msg: desc,
|
||||
Msg: strings.Join(msgs, "\n"),
|
||||
F: runChange,
|
||||
}}, nil
|
||||
|
||||
|
@ -203,9 +203,9 @@ func (n *namecheapProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mo
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// // because namecheap doesn't have selective create, delete, modify,
|
||||
// // we bundle them all up to send at once. We *do* want to see the
|
||||
// // changes though
|
||||
// because namecheap doesn't have selective create, delete, modify,
|
||||
// we bundle them all up to send at once. We *do* want to see the
|
||||
// changes though
|
||||
|
||||
var desc []string
|
||||
for _, i := range create {
|
||||
|
@ -55,14 +55,13 @@ func (n *namedotcomProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*m
|
||||
models.PostProcessRecords(actual)
|
||||
|
||||
var corrections []*models.Correction
|
||||
var create, del, mod diff.Changeset
|
||||
var differ diff.Differ
|
||||
if !diff2.EnableDiff2 {
|
||||
differ := diff.New(dc)
|
||||
_, create, del, mod, err = differ.IncrementalDiff(actual)
|
||||
differ = diff.New(dc)
|
||||
} else {
|
||||
differ := diff.NewCompat(dc)
|
||||
_, create, del, mod, err = differ.IncrementalDiff(actual)
|
||||
differ = diff.NewCompat(dc)
|
||||
}
|
||||
_, create, del, mod, err := differ.IncrementalDiff(actual)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -137,10 +137,6 @@ func (api *packetframeProvider) GetDomainCorrections(dc *models.DomainConfig) ([
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, m := range create {
|
||||
req, err := toReq(zone.ID, dc, m.Desired)
|
||||
if err != nil {
|
||||
|
@ -65,10 +65,6 @@ func (api *rwthProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*model
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, d := range create {
|
||||
des := d.Desired
|
||||
corrections = append(corrections, &models.Correction{
|
||||
|
Reference in New Issue
Block a user