Add route53 support to cloudformation.
This commit is contained in:
parent
babb7450ec
commit
5d5f241b99
5 changed files with 131 additions and 9 deletions
|
|
@ -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,
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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>"""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue