diff --git a/provider/aws.go b/provider/aws.go index 6aa0f0412..7bfee25bc 100644 --- a/provider/aws.go +++ b/provider/aws.go @@ -193,7 +193,7 @@ func (p *AWSProvider) Zones() (map[string]*route53.HostedZone, error) { // wildcardUnescape converts \\052.abc back to *.abc // Route53 stores wildcards escaped: http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DomainNameFormat.html?shortFooter=true#domain-name-format-asterisk func wildcardUnescape(s string) string { - if strings.HasPrefix(s, "\\052") { + if strings.Contains(s, "\\052") { s = strings.Replace(s, "\\052", "*", 1) } return s diff --git a/provider/aws_test.go b/provider/aws_test.go index 60c451e99..df36eaefc 100644 --- a/provider/aws_test.go +++ b/provider/aws_test.go @@ -89,7 +89,7 @@ func (r *Route53APIStub) ListResourceRecordSetsPages(input *route53.ListResource // Route53 stores wildcards escaped: http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DomainNameFormat.html?shortFooter=true#domain-name-format-asterisk func wildcardEscape(s string) string { - if strings.HasPrefix(s, "*") { + if strings.Contains(s, "*") { s = strings.Replace(s, "*", "\\052", 1) } return s @@ -257,6 +257,7 @@ func TestAWSRecords(t *testing.T) { endpoint.NewEndpoint("*.wildcard-test-alias.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeCNAME, "foo.eu-central-1.elb.amazonaws.com").WithProviderSpecific(providerSpecificEvaluateTargetHealth, "false"), endpoint.NewEndpoint("list-test-alias-evaluate.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeCNAME, "foo.eu-central-1.elb.amazonaws.com").WithProviderSpecific(providerSpecificEvaluateTargetHealth, "true"), endpoint.NewEndpointWithTTL("list-test-multiple.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeA, endpoint.TTL(recordTTL), "8.8.8.8", "8.8.4.4"), + endpoint.NewEndpointWithTTL("prefix-*.wildcard.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeTXT, endpoint.TTL(recordTTL), "random"), }) records, err := provider.Records() @@ -270,6 +271,7 @@ func TestAWSRecords(t *testing.T) { endpoint.NewEndpoint("*.wildcard-test-alias.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeCNAME, "foo.eu-central-1.elb.amazonaws.com").WithProviderSpecific(providerSpecificEvaluateTargetHealth, "false"), endpoint.NewEndpoint("list-test-alias-evaluate.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeCNAME, "foo.eu-central-1.elb.amazonaws.com").WithProviderSpecific(providerSpecificEvaluateTargetHealth, "true"), endpoint.NewEndpointWithTTL("list-test-multiple.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeA, endpoint.TTL(recordTTL), "8.8.8.8", "8.8.4.4"), + endpoint.NewEndpointWithTTL("prefix-*.wildcard.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeTXT, endpoint.TTL(recordTTL), "random"), }) } @@ -929,10 +931,13 @@ func setupAWSRecords(t *testing.T, provider *AWSProvider, endpoints []*endpoint. require.NoError(t, provider.CreateRecords(endpoints)) + escapeAWSRecords(t, provider, "/hostedzone/zone-1.ext-dns-test-2.teapot.zalan.do.") + escapeAWSRecords(t, provider, "/hostedzone/zone-2.ext-dns-test-2.teapot.zalan.do.") + escapeAWSRecords(t, provider, "/hostedzone/zone-3.ext-dns-test-2.teapot.zalan.do.") + records, err = provider.Records() require.NoError(t, err) - validateEndpoints(t, records, endpoints) } func listAWSRecords(t *testing.T, client Route53API, zone string) []*route53.ResourceRecordSet { @@ -941,10 +946,7 @@ func listAWSRecords(t *testing.T, client Route53API, zone string) []*route53.Res HostedZoneId: aws.String(zone), }, func(resp *route53.ListResourceRecordSetsOutput, _ bool) bool { for _, recordSet := range resp.ResourceRecordSets { - switch aws.StringValue(recordSet.Type) { - case endpoint.RecordTypeA, endpoint.RecordTypeCNAME: - recordSets = append(recordSets, recordSet) - } + recordSets = append(recordSets, recordSet) } return true })) @@ -974,6 +976,29 @@ func clearAWSRecords(t *testing.T, provider *AWSProvider, zone string) { } } +// Route53 stores wildcards escaped: http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DomainNameFormat.html?shortFooter=true#domain-name-format-asterisk +func escapeAWSRecords(t *testing.T, provider *AWSProvider, zone string) { + recordSets := listAWSRecords(t, provider.client, zone) + + changes := make([]*route53.Change, 0, len(recordSets)) + for _, recordSet := range recordSets { + changes = append(changes, &route53.Change{ + Action: aws.String(route53.ChangeActionUpsert), + ResourceRecordSet: recordSet, + }) + } + + if len(changes) != 0 { + _, err := provider.client.ChangeResourceRecordSets(&route53.ChangeResourceRecordSetsInput{ + HostedZoneId: aws.String(zone), + ChangeBatch: &route53.ChangeBatch{ + Changes: changes, + }, + }) + require.NoError(t, err) + } +} + func newAWSProvider(t *testing.T, domainFilter DomainFilter, zoneIDFilter ZoneIDFilter, zoneTypeFilter ZoneTypeFilter, evaluateTargetHealth, dryRun bool, records []*endpoint.Endpoint) (*AWSProvider, *Route53APIStub) { client := NewRoute53APIStub()