1
0
mirror of https://github.com/StackExchange/dnscontrol.git synced 2024-05-11 05:55:12 +00:00

NEW FEATURE: NO_PURGE reports what is not purged (diff2 only) (#2031)

This commit is contained in:
Tom Limoncelli
2023-02-01 07:27:00 -05:00
committed by GitHub
parent bbabf66113
commit de202531cb
12 changed files with 87 additions and 10 deletions

View File

@ -1,6 +1,8 @@
package diff package diff
import ( import (
"fmt"
"github.com/StackExchange/dnscontrol/v3/models" "github.com/StackExchange/dnscontrol/v3/models"
"github.com/StackExchange/dnscontrol/v3/pkg/diff2" "github.com/StackExchange/dnscontrol/v3/pkg/diff2"
) )
@ -62,6 +64,9 @@ func (d *differCompat) IncrementalDiff(existing []*models.RecordConfig) (unchang
for _, inst := range instructions { for _, inst := range instructions {
cor := Correlation{d: d.OldDiffer} cor := Correlation{d: d.OldDiffer}
switch inst.Type { switch inst.Type {
case diff2.REPORT:
// Sadly the NewCompat function doesn't have a way to do this.
// Purge reports are silently skipped.
case diff2.CREATE: case diff2.CREATE:
cor.Desired = inst.New[0] cor.Desired = inst.New[0]
create = append(create, cor) create = append(create, cor)
@ -72,6 +77,8 @@ func (d *differCompat) IncrementalDiff(existing []*models.RecordConfig) (unchang
case diff2.DELETE: case diff2.DELETE:
cor.Existing = inst.Old[0] cor.Existing = inst.Old[0]
toDelete = append(toDelete, cor) toDelete = append(toDelete, cor)
default:
panic(fmt.Sprintf("unhandled inst.Type %s", inst.Type))
} }
} }

View File

@ -19,6 +19,7 @@ const (
CREATE // Create a record/recordset/label where none existed before. CREATE // Create a record/recordset/label where none existed before.
CHANGE // Change existing record/recordset/label CHANGE // Change existing record/recordset/label
DELETE // Delete existing record/recordset/label DELETE // Delete existing record/recordset/label
REPORT // No change, but boy do I have something to say!
) )
type ChangeList []Change type ChangeList []Change
@ -48,28 +49,33 @@ General instructions:
for _, change := range changes { for _, change := range changes {
switch change.Type { switch change.Type {
case diff2.REPORT:
corr = &models.Correction{Msg: change.MsgsJoined}
case diff2.CREATE: case diff2.CREATE:
corr = &models.Correction{ corr = &models.Correction{
Msg: change.MsgsJoined, Msg: change.MsgsJoined,
F: func() error { F: func() error {
return c.createRecord(FILL IN) return c.createRecord(FILL_IN)
}, },
} }
case diff2.CHANGE: case diff2.CHANGE:
corr = &models.Correction{ corr = &models.Correction{
Msg: change.MsgsJoined, Msg: change.MsgsJoined,
F: func() error { F: func() error {
return c.modifyRecord(FILL IN) return c.modifyRecord(FILL_IN)
}, },
} }
case diff2.DELETE: case diff2.DELETE:
corr = &models.Correction{ corr = &models.Correction{
Msg: change.MsgsJoined, Msg: change.MsgsJoined,
F: func() error { F: func() error {
return c.deleteRecord(FILL IN) return c.deleteRecord(FILL_IN)
}, },
} }
default:
panic("unhandled change.TYPE %s", change.Type)
} }
corrections = append(corrections, corr) corrections = append(corrections, corr)
} }

View File

@ -1,5 +1,7 @@
package diff2 package diff2
import "strings"
func processPurge(instructions ChangeList, nopurge bool) ChangeList { func processPurge(instructions ChangeList, nopurge bool) ChangeList {
if nopurge { if nopurge {
@ -9,14 +11,30 @@ func processPurge(instructions ChangeList, nopurge bool) ChangeList {
// TODO(tlim): This can probably be done without allocations but it // TODO(tlim): This can probably be done without allocations but it
// works and I won't want to prematurely optimize. // works and I won't want to prematurely optimize.
var msgs []string
newinstructions := make(ChangeList, 0, len(instructions)) newinstructions := make(ChangeList, 0, len(instructions))
for _, j := range instructions { for _, j := range instructions {
if j.Type == DELETE { if j.Type == DELETE {
msgs = append(msgs, j.Msgs...)
continue continue
} }
newinstructions = append(newinstructions, j) newinstructions = append(newinstructions, j)
} }
// Report what would have been purged
if len(msgs) != 0 {
for i := range msgs {
msgs[i] = "NO_PURGE: Skipping " + msgs[i]
}
msgs = append([]string{"NO_PURGE Activated! Skipping these actions:"}, msgs...)
newinstructions = append(newinstructions, Change{
Type: REPORT,
Msgs: msgs,
MsgsJoined: strings.Join(msgs, "\n"),
})
}
return newinstructions return newinstructions
} }

View File

@ -340,6 +340,9 @@ func (a *azurednsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mod
for _, inst := range instructions { for _, inst := range instructions {
switch inst.Type { switch inst.Type {
case diff2.REPORT:
corrections = append(corrections, &models.Correction{Msg: inst.MsgsJoined})
case diff2.CHANGE, diff2.CREATE: case diff2.CHANGE, diff2.CREATE:
var rrset *adns.RecordSet var rrset *adns.RecordSet
var recordName string var recordName string
@ -390,6 +393,10 @@ func (a *azurednsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mod
return nil return nil
}, },
}) })
default:
panic(fmt.Sprintf("unhandled inst.Type %s", inst.Type))
} }
} }

View File

@ -361,6 +361,9 @@ func (client *gandiv5Provider) GenerateDomainCorrections(dc *models.DomainConfig
for _, inst := range instructions { for _, inst := range instructions {
switch inst.Type { switch inst.Type {
case diff2.REPORT:
corrections = append(corrections, &models.Correction{Msg: inst.MsgsJoined})
case diff2.CREATE: case diff2.CREATE:
// We have to create the label one rtype at a time. // We have to create the label one rtype at a time.
natives := recordsToNative(inst.New, dc.Name) natives := recordsToNative(inst.New, dc.Name)
@ -420,6 +423,9 @@ func (client *gandiv5Provider) GenerateDomainCorrections(dc *models.DomainConfig
return nil return nil
}, },
}) })
default:
panic(fmt.Sprintf("unhandled inst.Type %s", inst.Type))
} }
} }

View File

@ -158,6 +158,7 @@ func (c *gcoreProvider) GenerateDomainCorrections(dc *models.DomainConfig, exist
// Make delete happen earlier than creates & updates. // Make delete happen earlier than creates & updates.
var corrections []*models.Correction var corrections []*models.Correction
var deletions []*models.Correction var deletions []*models.Correction
var reports []*models.Correction
if !diff2.EnableDiff2 { if !diff2.EnableDiff2 {
@ -246,6 +247,8 @@ func (c *gcoreProvider) GenerateDomainCorrections(dc *models.DomainConfig, exist
msg := generateChangeMsg(change.Msgs) msg := generateChangeMsg(change.Msgs)
switch change.Type { switch change.Type {
case diff2.REPORT:
corrections = append(corrections, &models.Correction{Msg: change.MsgsJoined})
case diff2.CREATE: case diff2.CREATE:
corrections = append(corrections, &models.Correction{ corrections = append(corrections, &models.Correction{
Msg: msg, Msg: msg,
@ -267,9 +270,13 @@ func (c *gcoreProvider) GenerateDomainCorrections(dc *models.DomainConfig, exist
return c.provider.DeleteRRSet(c.ctx, zone, name, typ) return c.provider.DeleteRRSet(c.ctx, zone, name, typ)
}, },
}) })
default:
panic(fmt.Sprintf("unhandled change.Type %s", change.Type))
} }
} }
} }
return append(deletions, corrections...), nil result := append(reports, deletions...)
result = append(result, corrections...)
return result, nil
} }

View File

@ -259,6 +259,8 @@ func (c *hednsProvider) getDiff2DomainCorrections(dc *models.DomainConfig, zoneI
var corrections []*models.Correction var corrections []*models.Correction
for _, change := range changes { for _, change := range changes {
switch change.Type { switch change.Type {
case diff2.REPORT:
corrections = append(corrections, &models.Correction{Msg: change.MsgsJoined})
case diff2.CREATE: case diff2.CREATE:
record := change.New[0] record := change.New[0]
corrections = append(corrections, &models.Correction{ corrections = append(corrections, &models.Correction{
@ -284,6 +286,8 @@ func (c *hednsProvider) getDiff2DomainCorrections(dc *models.DomainConfig, zoneI
return c.deleteZoneRecord(zoneID, recordID) return c.deleteZoneRecord(zoneID, recordID)
}, },
}) })
default:
panic(fmt.Sprintf("unhandled change.Type %s", change.Type))
} }
} }

View File

@ -212,25 +212,28 @@ func (n *nsone) GetDomainCorrections(dc *models.DomainConfig) ([]*models.Correct
recs := change.New recs := change.New
desc := strings.Join(change.Msgs, "\n") desc := strings.Join(change.Msgs, "\n")
if change.Type == diff2.CREATE { switch change.Type {
case diff2.REPORT:
corrections = append(corrections, &models.Correction{Msg: change.MsgsJoined})
case diff2.CREATE:
corrections = append(corrections, &models.Correction{ corrections = append(corrections, &models.Correction{
Msg: desc, Msg: desc,
F: func() error { return n.add(recs, dc.Name) }, F: func() error { return n.add(recs, dc.Name) },
}) })
} case diff2.CHANGE:
if change.Type == diff2.CHANGE {
corrections = append(corrections, &models.Correction{ corrections = append(corrections, &models.Correction{
Msg: desc, Msg: desc,
F: func() error { return n.modify(recs, dc.Name) }, F: func() error { return n.modify(recs, dc.Name) },
}) })
case diff2.DELETE:
}
if change.Type == diff2.DELETE {
corrections = append(corrections, &models.Correction{ corrections = append(corrections, &models.Correction{
Msg: desc, Msg: desc,
F: func() error { return n.remove(key, dc.Name) }, F: func() error { return n.remove(key, dc.Name) },
}) })
default:
panic(fmt.Sprintf("unhandled inst.Type %s", change.Type))
} }
} }
return corrections, nil return corrections, nil
} }

View File

@ -201,6 +201,8 @@ func (c *ovhProvider) getDiff2DomainCorrections(dc *models.DomainConfig, actual
for _, inst := range instructions { for _, inst := range instructions {
switch inst.Type { switch inst.Type {
case diff2.REPORT:
corrections = append(corrections, &models.Correction{Msg: inst.MsgsJoined})
case diff2.CHANGE: case diff2.CHANGE:
corrections = append(corrections, &models.Correction{ corrections = append(corrections, &models.Correction{
Msg: inst.Msgs[0], Msg: inst.Msgs[0],
@ -217,6 +219,8 @@ func (c *ovhProvider) getDiff2DomainCorrections(dc *models.DomainConfig, actual
Msg: inst.Msgs[0], Msg: inst.Msgs[0],
F: c.deleteRecordFunc(rec.ID, dc.Name), F: c.deleteRecordFunc(rec.ID, dc.Name),
}) })
default:
panic(fmt.Sprintf("unhandled inst.Type %s", inst.Type))
} }
} }
return corrections, nil return corrections, nil

View File

@ -161,6 +161,8 @@ func (c *porkbunProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mode
for _, change := range changes { for _, change := range changes {
var corr *models.Correction var corr *models.Correction
switch change.Type { switch change.Type {
case diff2.REPORT:
corr = &models.Correction{Msg: change.MsgsJoined}
case diff2.CREATE: case diff2.CREATE:
req, err := toReq(change.New[0]) req, err := toReq(change.New[0])
if err != nil { if err != nil {
@ -192,6 +194,8 @@ func (c *porkbunProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mode
return c.deleteRecord(dc.Name, id) return c.deleteRecord(dc.Name, id)
}, },
} }
default:
panic(fmt.Sprintf("unhandled change.Type %s", change.Type))
} }
corrections = append(corrections, corr) corrections = append(corrections, corr)
} }

View File

@ -488,6 +488,9 @@ func (r *route53Provider) GetDomainCorrections(dc *models.DomainConfig) ([]*mode
switch inst.Type { switch inst.Type {
case diff2.REPORT:
corrections = append(corrections, &models.Correction{Msg: inst.MsgsJoined})
case diff2.CREATE: case diff2.CREATE:
fallthrough fallthrough
case diff2.CHANGE: case diff2.CHANGE:
@ -529,6 +532,10 @@ func (r *route53Provider) GetDomainCorrections(dc *models.DomainConfig) ([]*mode
Action: r53Types.ChangeActionDelete, Action: r53Types.ChangeActionDelete,
ResourceRecordSet: &rrset, ResourceRecordSet: &rrset,
} }
default:
panic(fmt.Sprintf("unhandled inst.Type %s", inst.Type))
} }
changes = append(changes, chg) changes = append(changes, chg)

View File

@ -183,6 +183,8 @@ func (api *vultrProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mode
for _, change := range changes { for _, change := range changes {
switch change.Type { switch change.Type {
case diff2.REPORT:
corrections = append(corrections, &models.Correction{Msg: change.MsgsJoined})
case diff2.CREATE: case diff2.CREATE:
r := toVultrRecord(dc, change.New[0], "0") r := toVultrRecord(dc, change.New[0], "0")
corrections = append(corrections, &models.Correction{ corrections = append(corrections, &models.Correction{
@ -208,6 +210,8 @@ func (api *vultrProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mode
return api.client.DomainRecord.Delete(context.Background(), dc.Name, id) return api.client.DomainRecord.Delete(context.Background(), dc.Name, id)
}, },
}) })
default:
panic(fmt.Sprintf("unhandled change.Type %s", change.Type))
} }
} }