Merge pull request #860 from 2rs2ts/add-list-hosted-zones-by-name
Add ListHostedZonesByName
This commit is contained in:
commit
7eb5b60620
@ -7,7 +7,7 @@ from .models import route53_backend
|
|||||||
import xmltodict
|
import xmltodict
|
||||||
|
|
||||||
|
|
||||||
class Route53 (BaseResponse):
|
class Route53(BaseResponse):
|
||||||
|
|
||||||
def list_or_create_hostzone_response(self, request, full_url, headers):
|
def list_or_create_hostzone_response(self, request, full_url, headers):
|
||||||
self.setup_class(request, full_url, headers)
|
self.setup_class(request, full_url, headers)
|
||||||
@ -47,6 +47,32 @@ class Route53 (BaseResponse):
|
|||||||
template = Template(LIST_HOSTED_ZONES_RESPONSE)
|
template = Template(LIST_HOSTED_ZONES_RESPONSE)
|
||||||
return 200, headers, template.render(zones=all_zones)
|
return 200, headers, template.render(zones=all_zones)
|
||||||
|
|
||||||
|
def list_hosted_zones_by_name_response(self, request, full_url, headers):
|
||||||
|
self.setup_class(request, full_url, headers)
|
||||||
|
parsed_url = urlparse(full_url)
|
||||||
|
query_params = parse_qs(parsed_url.query)
|
||||||
|
dnsname = query_params.get("dnsname")
|
||||||
|
|
||||||
|
if dnsname:
|
||||||
|
dnsname = dnsname[0] # parse_qs gives us a list, but this parameter doesn't repeat
|
||||||
|
# return all zones with that name (there can be more than one)
|
||||||
|
zones = [zone for zone in route53_backend.get_all_hosted_zones() if zone.name == dnsname]
|
||||||
|
else:
|
||||||
|
# sort by names, but with domain components reversed
|
||||||
|
# see http://boto3.readthedocs.io/en/latest/reference/services/route53.html#Route53.Client.list_hosted_zones_by_name
|
||||||
|
|
||||||
|
def sort_key(zone):
|
||||||
|
domains = zone.name.split(".")
|
||||||
|
if domains[-1] == "":
|
||||||
|
domains = domains[-1:] + domains[:-1]
|
||||||
|
return ".".join(reversed(domains))
|
||||||
|
|
||||||
|
zones = route53_backend.get_all_hosted_zones()
|
||||||
|
zones = sorted(zones, key=sort_key)
|
||||||
|
|
||||||
|
template = Template(LIST_HOSTED_ZONES_BY_NAME_RESPONSE)
|
||||||
|
return 200, headers, template.render(zones=zones)
|
||||||
|
|
||||||
def get_or_delete_hostzone_response(self, request, full_url, headers):
|
def get_or_delete_hostzone_response(self, request, full_url, headers):
|
||||||
self.setup_class(request, full_url, headers)
|
self.setup_class(request, full_url, headers)
|
||||||
parsed_url = urlparse(full_url)
|
parsed_url = urlparse(full_url)
|
||||||
@ -289,6 +315,25 @@ LIST_HOSTED_ZONES_RESPONSE = """<ListHostedZonesResponse xmlns="https://route53.
|
|||||||
<IsTruncated>false</IsTruncated>
|
<IsTruncated>false</IsTruncated>
|
||||||
</ListHostedZonesResponse>"""
|
</ListHostedZonesResponse>"""
|
||||||
|
|
||||||
|
LIST_HOSTED_ZONES_BY_NAME_RESPONSE = """<ListHostedZonesByNameResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
|
||||||
|
<HostedZones>
|
||||||
|
{% for zone in zones %}
|
||||||
|
<HostedZone>
|
||||||
|
<Id>/hostedzone/{{ zone.id }}</Id>
|
||||||
|
<Name>{{ zone.name }}</Name>
|
||||||
|
<Config>
|
||||||
|
{% if zone.comment %}
|
||||||
|
<Comment>{{ zone.comment }}</Comment>
|
||||||
|
{% endif %}
|
||||||
|
<PrivateZone>{{ zone.private_zone }}</PrivateZone>
|
||||||
|
</Config>
|
||||||
|
<ResourceRecordSetCount>{{ zone.rrsets|count }}</ResourceRecordSetCount>
|
||||||
|
</HostedZone>
|
||||||
|
{% endfor %}
|
||||||
|
</HostedZones>
|
||||||
|
<IsTruncated>false</IsTruncated>
|
||||||
|
</ListHostedZonesByNameResponse>"""
|
||||||
|
|
||||||
CREATE_HEALTH_CHECK_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
|
CREATE_HEALTH_CHECK_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<CreateHealthCheckResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
|
<CreateHealthCheckResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
|
||||||
{{ health_check.to_xml() }}
|
{{ health_check.to_xml() }}
|
||||||
|
@ -18,6 +18,7 @@ url_paths = {
|
|||||||
'{0}/(?P<api_version>[\d_-]+)/hostedzone$': Route53().list_or_create_hostzone_response,
|
'{0}/(?P<api_version>[\d_-]+)/hostedzone$': Route53().list_or_create_hostzone_response,
|
||||||
'{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)$': Route53().get_or_delete_hostzone_response,
|
'{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)$': Route53().get_or_delete_hostzone_response,
|
||||||
'{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/rrset/?$': Route53().rrset_response,
|
'{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/rrset/?$': Route53().rrset_response,
|
||||||
|
'{0}/(?P<api_version>[\d_-]+)/hostedzonesbyname': Route53().list_hosted_zones_by_name_response,
|
||||||
'{0}/(?P<api_version>[\d_-]+)/healthcheck': Route53().health_check_response,
|
'{0}/(?P<api_version>[\d_-]+)/healthcheck': Route53().health_check_response,
|
||||||
'{0}/(?P<api_version>[\d_-]+)/tags/healthcheck/(?P<zone_id>[^/]+)$': tag_response1,
|
'{0}/(?P<api_version>[\d_-]+)/tags/healthcheck/(?P<zone_id>[^/]+)$': tag_response1,
|
||||||
'{0}/(?P<api_version>[\d_-]+)/tags/hostedzone/(?P<zone_id>[^/]+)$': tag_response2,
|
'{0}/(?P<api_version>[\d_-]+)/tags/hostedzone/(?P<zone_id>[^/]+)$': tag_response2,
|
||||||
|
@ -361,8 +361,9 @@ def test_hosted_zone_private_zone_preserved_boto3():
|
|||||||
hosted_zones = conn.list_hosted_zones()
|
hosted_zones = conn.list_hosted_zones()
|
||||||
hosted_zones["HostedZones"][0]["Config"]["PrivateZone"].should.equal(True)
|
hosted_zones["HostedZones"][0]["Config"]["PrivateZone"].should.equal(True)
|
||||||
|
|
||||||
# zone = conn.list_hosted_zones_by_name(DNSName="testdns.aws.com.")
|
hosted_zones = conn.list_hosted_zones_by_name(DNSName="testdns.aws.com.")
|
||||||
# zone.config["PrivateZone"].should.equal(True)
|
len(hosted_zones["HostedZones"]).should.equal(1)
|
||||||
|
hosted_zones["HostedZones"][0]["Config"]["PrivateZone"].should.equal(True)
|
||||||
|
|
||||||
|
|
||||||
@mock_route53
|
@mock_route53
|
||||||
@ -445,3 +446,48 @@ def test_list_or_change_tags_for_resource_request():
|
|||||||
response = conn.list_tags_for_resource(
|
response = conn.list_tags_for_resource(
|
||||||
ResourceType='healthcheck', ResourceId=healthcheck_id)
|
ResourceType='healthcheck', ResourceId=healthcheck_id)
|
||||||
response['ResourceTagSet']['Tags'].should.be.empty
|
response['ResourceTagSet']['Tags'].should.be.empty
|
||||||
|
|
||||||
|
|
||||||
|
@mock_route53
|
||||||
|
def test_list_hosted_zones_by_name():
|
||||||
|
conn = boto3.client('route53', region_name='us-east-1')
|
||||||
|
conn.create_hosted_zone(
|
||||||
|
Name="test.b.com.",
|
||||||
|
CallerReference=str(hash('foo')),
|
||||||
|
HostedZoneConfig=dict(
|
||||||
|
PrivateZone=True,
|
||||||
|
Comment="test com",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
conn.create_hosted_zone(
|
||||||
|
Name="test.a.org.",
|
||||||
|
CallerReference=str(hash('bar')),
|
||||||
|
HostedZoneConfig=dict(
|
||||||
|
PrivateZone=True,
|
||||||
|
Comment="test org",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
conn.create_hosted_zone(
|
||||||
|
Name="test.a.org.",
|
||||||
|
CallerReference=str(hash('bar')),
|
||||||
|
HostedZoneConfig=dict(
|
||||||
|
PrivateZone=True,
|
||||||
|
Comment="test org 2",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# test lookup
|
||||||
|
zones = conn.list_hosted_zones_by_name(DNSName="test.b.com.")
|
||||||
|
len(zones["HostedZones"]).should.equal(1)
|
||||||
|
zones["HostedZones"][0]["Name"].should.equal("test.b.com.")
|
||||||
|
zones = conn.list_hosted_zones_by_name(DNSName="test.a.org.")
|
||||||
|
len(zones["HostedZones"]).should.equal(2)
|
||||||
|
zones["HostedZones"][0]["Name"].should.equal("test.a.org.")
|
||||||
|
zones["HostedZones"][1]["Name"].should.equal("test.a.org.")
|
||||||
|
|
||||||
|
# test sort order
|
||||||
|
zones = conn.list_hosted_zones_by_name()
|
||||||
|
len(zones["HostedZones"]).should.equal(3)
|
||||||
|
zones["HostedZones"][0]["Name"].should.equal("test.b.com.")
|
||||||
|
zones["HostedZones"][1]["Name"].should.equal("test.a.org.")
|
||||||
|
zones["HostedZones"][2]["Name"].should.equal("test.a.org.")
|
||||||
|
Loading…
Reference in New Issue
Block a user