From c8ec72e33c5e9be42e1b4e6d0efa84de6b9aad98 Mon Sep 17 00:00:00 2001 From: Justin Santa Barbara Date: Fri, 15 Jul 2016 11:35:32 -0400 Subject: [PATCH] dnsprovider: Use route53 page functions to avoid truncated results The ListPages functions make it pretty easy to avoid result truncation; switch to using them --- .../dnsprovider/providers/aws/route53/rrsets.go | 14 ++++++++------ .../providers/aws/route53/stubs/route53api.go | 16 ++++++++++------ .../dnsprovider/providers/aws/route53/zones.go | 16 ++++++++-------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/federation/pkg/dnsprovider/providers/aws/route53/rrsets.go b/federation/pkg/dnsprovider/providers/aws/route53/rrsets.go index 221e217f3a9..33dcd06d2b2 100644 --- a/federation/pkg/dnsprovider/providers/aws/route53/rrsets.go +++ b/federation/pkg/dnsprovider/providers/aws/route53/rrsets.go @@ -34,15 +34,17 @@ func (rrsets ResourceRecordSets) List() ([]dnsprovider.ResourceRecordSet, error) input := route53.ListResourceRecordSetsInput{ HostedZoneId: rrsets.zone.impl.Id, } - response, err := rrsets.zone.zones.interface_.service.ListResourceRecordSets(&input) - // TODO: Handle truncated responses + + var list []dnsprovider.ResourceRecordSet + err := rrsets.zone.zones.interface_.service.ListResourceRecordSetsPages(&input, func(page *route53.ListResourceRecordSetsOutput, lastPage bool) bool { + for _, rrset := range page.ResourceRecordSets { + list = append(list, &ResourceRecordSet{rrset, &rrsets}) + } + return true + }) if err != nil { return nil, err } - list := make([]dnsprovider.ResourceRecordSet, len(response.ResourceRecordSets)) - for i, rrset := range response.ResourceRecordSets { - list[i] = &ResourceRecordSet{rrset, &rrsets} - } return list, nil } diff --git a/federation/pkg/dnsprovider/providers/aws/route53/stubs/route53api.go b/federation/pkg/dnsprovider/providers/aws/route53/stubs/route53api.go index 3b2b6b73b31..f133c163fe8 100644 --- a/federation/pkg/dnsprovider/providers/aws/route53/stubs/route53api.go +++ b/federation/pkg/dnsprovider/providers/aws/route53/stubs/route53api.go @@ -27,9 +27,9 @@ var _ Route53API = &Route53APIStub{} /* Route53API is the subset of the AWS Route53 API that we actually use. Add methods as required. Signatures must match exactly. */ type Route53API interface { - ListResourceRecordSets(*route53.ListResourceRecordSetsInput) (*route53.ListResourceRecordSetsOutput, error) + ListResourceRecordSetsPages(input *route53.ListResourceRecordSetsInput, fn func(p *route53.ListResourceRecordSetsOutput, lastPage bool) (shouldContinue bool)) error ChangeResourceRecordSets(*route53.ChangeResourceRecordSetsInput) (*route53.ChangeResourceRecordSetsOutput, error) - ListHostedZones(*route53.ListHostedZonesInput) (*route53.ListHostedZonesOutput, error) + ListHostedZonesPages(input *route53.ListHostedZonesInput, fn func(p *route53.ListHostedZonesOutput, lastPage bool) (shouldContinue bool)) error CreateHostedZone(*route53.CreateHostedZoneInput) (*route53.CreateHostedZoneOutput, error) DeleteHostedZone(*route53.DeleteHostedZoneInput) (*route53.DeleteHostedZoneOutput, error) } @@ -50,7 +50,7 @@ func NewRoute53APIStub() *Route53APIStub { } } -func (r *Route53APIStub) ListResourceRecordSets(input *route53.ListResourceRecordSetsInput) (*route53.ListResourceRecordSetsOutput, error) { +func (r *Route53APIStub) ListResourceRecordSetsPages(input *route53.ListResourceRecordSetsInput, fn func(p *route53.ListResourceRecordSetsOutput, lastPage bool) (shouldContinue bool)) error { output := route53.ListResourceRecordSetsOutput{} // TODO: Support optional input args. if len(r.recordSets) <= 0 { output.ResourceRecordSets = []*route53.ResourceRecordSet{} @@ -63,7 +63,9 @@ func (r *Route53APIStub) ListResourceRecordSets(input *route53.ListResourceRecor } } } - return &output, nil + lastPage := true + fn(&output, lastPage) + return nil } func (r *Route53APIStub) ChangeResourceRecordSets(input *route53.ChangeResourceRecordSetsInput) (*route53.ChangeResourceRecordSetsOutput, error) { @@ -93,12 +95,14 @@ func (r *Route53APIStub) ChangeResourceRecordSets(input *route53.ChangeResourceR return output, nil // TODO: We should ideally return status etc, but we dont' use that yet. } -func (r *Route53APIStub) ListHostedZones(*route53.ListHostedZonesInput) (*route53.ListHostedZonesOutput, error) { +func (r *Route53APIStub) ListHostedZonesPages(input *route53.ListHostedZonesInput, fn func(p *route53.ListHostedZonesOutput, lastPage bool) (shouldContinue bool)) error { output := &route53.ListHostedZonesOutput{} for _, zone := range r.zones { output.HostedZones = append(output.HostedZones, zone) } - return output, nil + lastPage := true + fn(output, lastPage) + return nil } func (r *Route53APIStub) CreateHostedZone(input *route53.CreateHostedZoneInput) (*route53.CreateHostedZoneOutput, error) { diff --git a/federation/pkg/dnsprovider/providers/aws/route53/zones.go b/federation/pkg/dnsprovider/providers/aws/route53/zones.go index 015f3d78626..fd5ab24aa14 100644 --- a/federation/pkg/dnsprovider/providers/aws/route53/zones.go +++ b/federation/pkg/dnsprovider/providers/aws/route53/zones.go @@ -31,18 +31,18 @@ type Zones struct { } func (zones Zones) List() ([]dnsprovider.Zone, error) { + var zoneList []dnsprovider.Zone + input := route53.ListHostedZonesInput{} - response, err := zones.interface_.service.ListHostedZones(&input) + err := zones.interface_.service.ListHostedZonesPages(&input, func(page *route53.ListHostedZonesOutput, lastPage bool) bool { + for _, zone := range page.HostedZones { + zoneList = append(zoneList, &Zone{zone, &zones}) + } + return true + }) if err != nil { return []dnsprovider.Zone{}, err } - hostedZones := response.HostedZones - // TODO: Handle result truncation - // https://docs.aws.amazon.com/sdk-for-go/api/service/route53/Route53.html#ListHostedZones-instance_method - zoneList := make([]dnsprovider.Zone, len(hostedZones)) - for i, zone := range hostedZones { - zoneList[i] = &Zone{zone, &zones} - } return zoneList, nil }