Skip to content

Commit

Permalink
Merge 6905535 into 92e3263
Browse files Browse the repository at this point in the history
  • Loading branch information
mcayland committed Nov 21, 2019
2 parents 92e3263 + 6905535 commit dee6b16
Show file tree
Hide file tree
Showing 3 changed files with 208 additions and 61 deletions.
24 changes: 15 additions & 9 deletions provider/designate.go
Original file line number Diff line number Diff line change
Expand Up @@ -320,10 +320,10 @@ func (p designateProvider) Records() ([]*endpoint.Endpoint, error) {
return nil
}
for _, record := range recordSet.Records {
ep := endpoint.NewEndpoint(recordSet.Name, recordSet.Type, record)
ep.Labels[designateRecordSetID] = recordSet.ID
ep.Labels[designateZoneID] = recordSet.ZoneID
ep.Labels[designateOriginalRecords] = strings.Join(recordSet.Records, "\000")
ep := endpoint.NewEndpoint(recordSet.Name, recordSet.Type, record).
WithProviderSpecific(designateRecordSetID, recordSet.ID).
WithProviderSpecific(designateZoneID, recordSet.ZoneID).
WithProviderSpecific(designateOriginalRecords, strings.Join(recordSet.Records, "\000"))
result = append(result, ep)
}
return nil
Expand Down Expand Up @@ -358,14 +358,20 @@ func addEndpoint(ep *endpoint.Endpoint, recordSets map[string]*recordSet, delete
}
}
if rs.zoneID == "" {
rs.zoneID = ep.Labels[designateZoneID]
if prop, ok := ep.GetProviderSpecificProperty(designateZoneID); ok {
rs.zoneID = prop.Value
}
}
if rs.recordSetID == "" {
rs.recordSetID = ep.Labels[designateRecordSetID]
if prop, ok := ep.GetProviderSpecificProperty(designateRecordSetID); ok {
rs.recordSetID = prop.Value
}
}
for _, rec := range strings.Split(ep.Labels[designateOriginalRecords], "\000") {
if _, ok := rs.names[rec]; !ok && rec != "" {
rs.names[rec] = true
if prop, ok := ep.GetProviderSpecificProperty(designateOriginalRecords); ok {
for _, rec := range strings.Split(prop.Value, "\000") {
if _, ok := rs.names[rec]; !ok && rec != "" {
rs.names[rec] = true
}
}
}
targets := ep.Targets
Expand Down
216 changes: 168 additions & 48 deletions provider/designate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -244,60 +244,120 @@ func TestDesignateRecords(t *testing.T) {
DNSName: "www.example.com",
RecordType: endpoint.RecordTypeA,
Targets: endpoint.Targets{"10.1.1.1"},
Labels: map[string]string{
designateRecordSetID: rs11ID,
designateZoneID: zone1ID,
designateOriginalRecords: "10.1.1.1",
Labels: map[string]string{},
ProviderSpecific: []endpoint.ProviderSpecificProperty{
endpoint.ProviderSpecificProperty{
Name: designateRecordSetID,
Value: rs11ID,
},
endpoint.ProviderSpecificProperty{
Name: designateZoneID,
Value: zone1ID,
},
endpoint.ProviderSpecificProperty{
Name: designateOriginalRecords,
Value: "10.1.1.1",
},
},
},
{
DNSName: "www.example.com",
RecordType: endpoint.RecordTypeTXT,
Targets: endpoint.Targets{"text1"},
Labels: map[string]string{
designateRecordSetID: rs12ID,
designateZoneID: zone1ID,
designateOriginalRecords: "text1",
Labels: map[string]string{},
ProviderSpecific: []endpoint.ProviderSpecificProperty{
endpoint.ProviderSpecificProperty{
Name: designateRecordSetID,
Value: rs12ID,
},
endpoint.ProviderSpecificProperty{
Name: designateZoneID,
Value: zone1ID,
},
endpoint.ProviderSpecificProperty{
Name: designateOriginalRecords,
Value: "text1",
},
},
},
{
DNSName: "ftp.example.com",
RecordType: endpoint.RecordTypeA,
Targets: endpoint.Targets{"10.1.1.2"},
Labels: map[string]string{
designateRecordSetID: rs14ID,
designateZoneID: zone1ID,
designateOriginalRecords: "10.1.1.2",
Labels: map[string]string{},
ProviderSpecific: []endpoint.ProviderSpecificProperty{
endpoint.ProviderSpecificProperty{
Name: designateRecordSetID,
Value: rs14ID,
},
endpoint.ProviderSpecificProperty{
Name: designateZoneID,
Value: zone1ID,
},
endpoint.ProviderSpecificProperty{
Name: designateOriginalRecords,
Value: "10.1.1.2",
},
},
},
{
DNSName: "srv.test.net",
RecordType: endpoint.RecordTypeA,
Targets: endpoint.Targets{"10.2.1.1"},
Labels: map[string]string{
designateRecordSetID: rs21ID,
designateZoneID: zone2ID,
designateOriginalRecords: "10.2.1.1\00010.2.1.2",
Labels: map[string]string{},
ProviderSpecific: []endpoint.ProviderSpecificProperty{
endpoint.ProviderSpecificProperty{
Name: designateRecordSetID,
Value: rs21ID,
},
endpoint.ProviderSpecificProperty{
Name: designateZoneID,
Value: zone2ID,
},
endpoint.ProviderSpecificProperty{
Name: designateOriginalRecords,
Value: "10.2.1.1\00010.2.1.2",
},
},
},
{
DNSName: "srv.test.net",
RecordType: endpoint.RecordTypeA,
Targets: endpoint.Targets{"10.2.1.2"},
Labels: map[string]string{
designateRecordSetID: rs21ID,
designateZoneID: zone2ID,
designateOriginalRecords: "10.2.1.1\00010.2.1.2",
Labels: map[string]string{},
ProviderSpecific: []endpoint.ProviderSpecificProperty{
endpoint.ProviderSpecificProperty{
Name: designateRecordSetID,
Value: rs21ID,
},
endpoint.ProviderSpecificProperty{
Name: designateZoneID,
Value: zone2ID,
},
endpoint.ProviderSpecificProperty{
Name: designateOriginalRecords,
Value: "10.2.1.1\00010.2.1.2",
},
},
},
{
DNSName: "db.test.net",
RecordType: endpoint.RecordTypeCNAME,
Targets: endpoint.Targets{"sql.test.net"},
Labels: map[string]string{
designateRecordSetID: rs22ID,
designateZoneID: zone2ID,
designateOriginalRecords: "sql.test.net.",
Labels: map[string]string{},
ProviderSpecific: []endpoint.ProviderSpecificProperty{
endpoint.ProviderSpecificProperty{
Name: designateRecordSetID,
Value: rs22ID,
},
endpoint.ProviderSpecificProperty{
Name: designateZoneID,
Value: zone2ID,
},
endpoint.ProviderSpecificProperty{
Name: designateOriginalRecords,
Value: "sql.test.net.",
},
},
},
}
Expand Down Expand Up @@ -452,20 +512,40 @@ func testDesignateUpdateRecords(t *testing.T, client *fakeDesignateClient) []*re
DNSName: "ftp.example.com",
RecordType: endpoint.RecordTypeA,
Targets: endpoint.Targets{"10.1.1.2"},
Labels: map[string]string{
designateZoneID: "zone-1",
designateRecordSetID: expected[2].ID,
designateOriginalRecords: "10.1.1.2",
Labels: map[string]string{},
ProviderSpecific: []endpoint.ProviderSpecificProperty{
endpoint.ProviderSpecificProperty{
Name: designateRecordSetID,
Value: expected[2].ID,
},
endpoint.ProviderSpecificProperty{
Name: designateZoneID,
Value: "zone-1",
},
endpoint.ProviderSpecificProperty{
Name: designateOriginalRecords,
Value: "10.1.1.2",
},
},
},
{
DNSName: "srv.test.net.",
RecordType: endpoint.RecordTypeA,
Targets: endpoint.Targets{"10.2.1.2"},
Labels: map[string]string{
designateZoneID: "zone-2",
designateRecordSetID: expected[3].ID,
designateOriginalRecords: "10.2.1.1\00010.2.1.2",
Labels: map[string]string{},
ProviderSpecific: []endpoint.ProviderSpecificProperty{
endpoint.ProviderSpecificProperty{
Name: designateRecordSetID,
Value: expected[3].ID,
},
endpoint.ProviderSpecificProperty{
Name: designateZoneID,
Value: "zone-2",
},
endpoint.ProviderSpecificProperty{
Name: designateOriginalRecords,
Value: "10.2.1.1\00010.2.1.2",
},
},
},
}
Expand All @@ -474,20 +554,40 @@ func testDesignateUpdateRecords(t *testing.T, client *fakeDesignateClient) []*re
DNSName: "ftp.example.com",
RecordType: endpoint.RecordTypeA,
Targets: endpoint.Targets{"10.3.3.1"},
Labels: map[string]string{
designateZoneID: "zone-1",
designateRecordSetID: expected[2].ID,
designateOriginalRecords: "10.1.1.2",
Labels: map[string]string{},
ProviderSpecific: []endpoint.ProviderSpecificProperty{
endpoint.ProviderSpecificProperty{
Name: designateRecordSetID,
Value: expected[2].ID,
},
endpoint.ProviderSpecificProperty{
Name: designateZoneID,
Value: "zone-1",
},
endpoint.ProviderSpecificProperty{
Name: designateOriginalRecords,
Value: "10.1.1.2",
},
},
},
{
DNSName: "srv.test.net.",
RecordType: endpoint.RecordTypeA,
Targets: endpoint.Targets{"10.3.3.2"},
Labels: map[string]string{
designateZoneID: "zone-2",
designateRecordSetID: expected[3].ID,
designateOriginalRecords: "10.2.1.1\00010.2.1.2",
Labels: map[string]string{},
ProviderSpecific: []endpoint.ProviderSpecificProperty{
endpoint.ProviderSpecificProperty{
Name: designateRecordSetID,
Value: expected[3].ID,
},
endpoint.ProviderSpecificProperty{
Name: designateZoneID,
Value: "zone-2",
},
endpoint.ProviderSpecificProperty{
Name: designateOriginalRecords,
Value: "10.2.1.1\00010.2.1.2",
},
},
},
}
Expand Down Expand Up @@ -535,20 +635,40 @@ func testDesignateDeleteRecords(t *testing.T, client *fakeDesignateClient) {
DNSName: "www.example.com.",
RecordType: endpoint.RecordTypeA,
Targets: endpoint.Targets{"10.1.1.1"},
Labels: map[string]string{
designateZoneID: "zone-1",
designateRecordSetID: expected[0].ID,
designateOriginalRecords: "10.1.1.1",
Labels: map[string]string{},
ProviderSpecific: []endpoint.ProviderSpecificProperty{
endpoint.ProviderSpecificProperty{
Name: designateRecordSetID,
Value: expected[0].ID,
},
endpoint.ProviderSpecificProperty{
Name: designateZoneID,
Value: "zone-1",
},
endpoint.ProviderSpecificProperty{
Name: designateOriginalRecords,
Value: "10.1.1.1",
},
},
},
{
DNSName: "srv.test.net.",
RecordType: endpoint.RecordTypeA,
Targets: endpoint.Targets{"10.2.1.1"},
Labels: map[string]string{
designateZoneID: "zone-2",
designateRecordSetID: expected[3].ID,
designateOriginalRecords: "10.2.1.1\00010.3.3.2",
Labels: map[string]string{},
ProviderSpecific: []endpoint.ProviderSpecificProperty{
endpoint.ProviderSpecificProperty{
Name: designateRecordSetID,
Value: expected[3].ID,
},
endpoint.ProviderSpecificProperty{
Name: designateZoneID,
Value: "zone-2",
},
endpoint.ProviderSpecificProperty{
Name: designateOriginalRecords,
Value: "10.2.1.1\00010.3.3.2",
},
},
},
}
Expand Down
29 changes: 25 additions & 4 deletions registry/txt.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,13 +129,31 @@ func (im *TXTRegistry) ApplyChanges(ctx context.Context, changes *plan.Changes)
UpdateOld: filterOwnedRecords(im.ownerID, changes.UpdateOld),
Delete: filterOwnedRecords(im.ownerID, changes.Delete),
}

// Retain ProviderSpecific properties from existing TXT record if present
providerSpecificPropertyMap := map[string]endpoint.ProviderSpecific{}
records, err := im.provider.Records()
if err != nil {
return err
}
for _, r := range records {
if r.RecordType == endpoint.RecordTypeTXT {
_, err := endpoint.NewLabelsFromString(r.Targets[0])
if err == nil {
key := fmt.Sprintf("%s::%s", r.DNSName, r.SetIdentifier)
providerSpecificPropertyMap[key] = r.ProviderSpecific
}
}
}

for _, r := range filteredChanges.Create {
if r.Labels == nil {
r.Labels = make(map[string]string)
}
r.Labels[endpoint.OwnerLabelKey] = im.ownerID
key := fmt.Sprintf("%s::%s", r.DNSName, r.SetIdentifier)
txt := endpoint.NewEndpoint(im.mapper.toTXTName(r.DNSName), endpoint.RecordTypeTXT, r.Labels.Serialize(true)).WithSetIdentifier(r.SetIdentifier)
txt.ProviderSpecific = r.ProviderSpecific
txt.ProviderSpecific = providerSpecificPropertyMap[key]
filteredChanges.Create = append(filteredChanges.Create, txt)

if im.cacheInterval > 0 {
Expand All @@ -144,8 +162,9 @@ func (im *TXTRegistry) ApplyChanges(ctx context.Context, changes *plan.Changes)
}

for _, r := range filteredChanges.Delete {
key := fmt.Sprintf("%s::%s", r.DNSName, r.SetIdentifier)
txt := endpoint.NewEndpoint(im.mapper.toTXTName(r.DNSName), endpoint.RecordTypeTXT, r.Labels.Serialize(true)).WithSetIdentifier(r.SetIdentifier)
txt.ProviderSpecific = r.ProviderSpecific
txt.ProviderSpecific = providerSpecificPropertyMap[key]

// when we delete TXT records for which value has changed (due to new label) this would still work because
// !!! TXT record value is uniquely generated from the Labels of the endpoint. Hence old TXT record can be uniquely reconstructed
Expand All @@ -158,8 +177,9 @@ func (im *TXTRegistry) ApplyChanges(ctx context.Context, changes *plan.Changes)

// make sure TXT records are consistently updated as well
for _, r := range filteredChanges.UpdateOld {
key := fmt.Sprintf("%s::%s", r.DNSName, r.SetIdentifier)
txt := endpoint.NewEndpoint(im.mapper.toTXTName(r.DNSName), endpoint.RecordTypeTXT, r.Labels.Serialize(true)).WithSetIdentifier(r.SetIdentifier)
txt.ProviderSpecific = r.ProviderSpecific
txt.ProviderSpecific = providerSpecificPropertyMap[key]
// when we updateOld TXT records for which value has changed (due to new label) this would still work because
// !!! TXT record value is uniquely generated from the Labels of the endpoint. Hence old TXT record can be uniquely reconstructed
filteredChanges.UpdateOld = append(filteredChanges.UpdateOld, txt)
Expand All @@ -171,8 +191,9 @@ func (im *TXTRegistry) ApplyChanges(ctx context.Context, changes *plan.Changes)

// make sure TXT records are consistently updated as well
for _, r := range filteredChanges.UpdateNew {
key := fmt.Sprintf("%s::%s", r.DNSName, r.SetIdentifier)
txt := endpoint.NewEndpoint(im.mapper.toTXTName(r.DNSName), endpoint.RecordTypeTXT, r.Labels.Serialize(true)).WithSetIdentifier(r.SetIdentifier)
txt.ProviderSpecific = r.ProviderSpecific
txt.ProviderSpecific = providerSpecificPropertyMap[key]
filteredChanges.UpdateNew = append(filteredChanges.UpdateNew, txt)
// add new version of record to cache
if im.cacheInterval > 0 {
Expand Down

0 comments on commit dee6b16

Please sign in to comment.