Add route53 support to cloudformation.

This commit is contained in:
Steve Pulec 2015-01-17 10:17:25 -05:00
commit 5d5f241b99
5 changed files with 131 additions and 9 deletions

View file

@ -8,6 +8,7 @@ from moto.ec2 import models as ec2_models
from moto.elb import models as elb_models
from moto.iam import models as iam_models
from moto.rds import models as rds_models
from moto.route53 import models as route53_models
from moto.sqs import models as sqs_models
from .utils import random_suffix
from .exceptions import MissingParameterError, UnformattedGetAttTemplateException
@ -36,6 +37,8 @@ MODEL_MAP = {
"AWS::RDS::DBInstance": rds_models.Database,
"AWS::RDS::DBSecurityGroup": rds_models.SecurityGroup,
"AWS::RDS::DBSubnetGroup": rds_models.SubnetGroup,
"AWS::Route53::HostedZone": route53_models.FakeZone,
"AWS::Route53::RecordSetGroup": route53_models.RecordSetGroup,
"AWS::SQS::Queue": sqs_models.Queue,
}

View file

@ -8,13 +8,43 @@ class FakeZone(object):
def __init__(self, name, id_):
self.name = name
self.id = id_
self.rrsets = {}
self.rrsets = []
def add_rrset(self, name, rrset):
self.rrsets[name] = rrset
self.rrsets.append(rrset)
def delete_rrset(self, name):
self.rrsets.pop(name, None)
self.rrsets = [record_set for record_set in self.rrsets if record_set['Name'] != name]
@property
def physical_resource_id(self):
return self.name
@classmethod
def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
properties = cloudformation_json['Properties']
name = properties["Name"]
hosted_zone = route53_backend.create_hosted_zone(name)
return hosted_zone
class RecordSetGroup(object):
def __init__(self, record_sets):
self.record_sets = record_sets
@classmethod
def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
properties = cloudformation_json['Properties']
zone_name = properties["HostedZoneName"]
hosted_zone = route53_backend.get_hosted_zone_by_name(zone_name)
record_sets = properties["RecordSets"]
for record_set in record_sets:
hosted_zone.add_rrset(record_set["Name"], record_set)
record_set_group = RecordSetGroup(record_sets)
return record_set_group
class Route53Backend(BaseBackend):
@ -34,12 +64,16 @@ class Route53Backend(BaseBackend):
def get_hosted_zone(self, id_):
return self.zones.get(id_)
def get_hosted_zone_by_name(self, name):
for zone in self.get_all_hosted_zones():
if zone.name == name:
return zone
def delete_hosted_zone(self, id_):
zone = self.zones.get(id_)
if zone:
del self.zones[id_]
return zone
return None
route53_backend = Route53Backend()

View file

@ -66,12 +66,12 @@ def rrset_response(request, full_url, headers):
querystring = parse_qs(parsed_url.query)
template = Template(LIST_RRSET_REPONSE)
rrset_list = []
for key, value in the_zone.rrsets.items():
if 'type' in querystring and querystring["type"][0] != value["Type"]:
for record_set in the_zone.rrsets:
if 'type' in querystring and querystring["type"][0] != record_set["Type"]:
continue
if 'name' in querystring and querystring["name"][0] != value["Name"]:
if 'name' in querystring and querystring["name"][0] != record_set["Name"]:
continue
rrset_list.append(dicttoxml.dicttoxml({"ResourceRecordSet": value}, root=False))
rrset_list.append(dicttoxml.dicttoxml({"ResourceRecordSet": record_set}, root=False))
return 200, headers, template.render(rrsets=rrset_list)
@ -79,7 +79,7 @@ def rrset_response(request, full_url, headers):
LIST_RRSET_REPONSE = """<ListResourceRecordSetsResponse xmlns="https://route53.amazonaws.com/doc/2012-12-12/">
<ResourceRecordSets>
{% for rrset in rrsets %}
{{ rrset }}
{{ rrset }}
{% endfor %}
</ResourceRecordSets>
</ListResourceRecordSetsResponse>"""