Mercurial > repos > shellac > sam_consensus_v3
diff env/lib/python3.9/site-packages/boto/route53/record.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.9/site-packages/boto/route53/record.py Mon Mar 22 18:12:50 2021 +0000 @@ -0,0 +1,374 @@ +# Copyright (c) 2010 Chris Moyer http://coredumped.org/ +# Copyright (c) 2012 Mitch Garnaat http://garnaat.org/ +# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, dis- +# tribute, sublicense, and/or sell copies of the Software, and to permit +# persons to whom the Software is furnished to do so, subject to the fol- +# lowing conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- +# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +RECORD_TYPES = ['A', 'AAAA', 'TXT', 'CNAME', 'MX', 'PTR', 'SRV', 'SPF'] + +from boto.resultset import ResultSet + + +class ResourceRecordSets(ResultSet): + """ + A list of resource records. + + :ivar hosted_zone_id: The ID of the hosted zone. + :ivar comment: A comment that will be stored with the change. + :ivar changes: A list of changes. + """ + + ChangeResourceRecordSetsBody = """<?xml version="1.0" encoding="UTF-8"?> + <ChangeResourceRecordSetsRequest xmlns="https://route53.amazonaws.com/doc/2013-04-01/"> + <ChangeBatch> + <Comment>%(comment)s</Comment> + <Changes>%(changes)s</Changes> + </ChangeBatch> + </ChangeResourceRecordSetsRequest>""" + + ChangeXML = """<Change> + <Action>%(action)s</Action> + %(record)s + </Change>""" + + def __init__(self, connection=None, hosted_zone_id=None, comment=None): + self.connection = connection + self.hosted_zone_id = hosted_zone_id + self.comment = comment + self.changes = [] + self.next_record_name = None + self.next_record_type = None + self.next_record_identifier = None + super(ResourceRecordSets, self).__init__([('ResourceRecordSet', Record)]) + + def __repr__(self): + if self.changes: + record_list = ','.join([c.__repr__() for c in self.changes]) + else: + record_list = ','.join([record.__repr__() for record in self]) + return '<ResourceRecordSets:%s [%s]' % (self.hosted_zone_id, + record_list) + + def add_change(self, action, name, type, ttl=600, + alias_hosted_zone_id=None, alias_dns_name=None, identifier=None, + weight=None, region=None, alias_evaluate_target_health=None, + health_check=None, failover=None): + """ + Add a change request to the set. + + :type action: str + :param action: The action to perform ('CREATE'|'DELETE'|'UPSERT') + + :type name: str + :param name: The name of the domain you want to perform the action on. + + :type type: str + :param type: The DNS record type. Valid values are: + + * A + * AAAA + * CNAME + * MX + * NS + * PTR + * SOA + * SPF + * SRV + * TXT + + :type ttl: int + :param ttl: The resource record cache time to live (TTL), in seconds. + + :type alias_hosted_zone_id: str + :param alias_dns_name: *Alias resource record sets only* The value + of the hosted zone ID, CanonicalHostedZoneNameId, for + the LoadBalancer. + + :type alias_dns_name: str + :param alias_hosted_zone_id: *Alias resource record sets only* + Information about the domain to which you are redirecting traffic. + + :type identifier: str + :param identifier: *Weighted and latency-based resource record sets + only* An identifier that differentiates among multiple resource + record sets that have the same combination of DNS name and type. + + :type weight: int + :param weight: *Weighted resource record sets only* Among resource + record sets that have the same combination of DNS name and type, + a value that determines what portion of traffic for the current + resource record set is routed to the associated location + + :type region: str + :param region: *Latency-based resource record sets only* Among resource + record sets that have the same combination of DNS name and type, + a value that determines which region this should be associated with + for the latency-based routing + + :type alias_evaluate_target_health: bool + :param alias_evaluate_target_health: *Required for alias resource record + sets* Indicates whether this Resource Record Set should respect the + health status of any health checks associated with the ALIAS target + record which it is linked to. + + :type health_check: str + :param health_check: Health check to associate with this record + + :type failover: str + :param failover: *Failover resource record sets only* Whether this is the + primary or secondary resource record set. + """ + change = Record(name, type, ttl, + alias_hosted_zone_id=alias_hosted_zone_id, + alias_dns_name=alias_dns_name, identifier=identifier, + weight=weight, region=region, + alias_evaluate_target_health=alias_evaluate_target_health, + health_check=health_check, failover=failover) + self.changes.append([action, change]) + return change + + def add_change_record(self, action, change): + """Add an existing record to a change set with the specified action""" + self.changes.append([action, change]) + return + + def to_xml(self): + """Convert this ResourceRecordSet into XML + to be saved via the ChangeResourceRecordSetsRequest""" + changesXML = "" + for change in self.changes: + changeParams = {"action": change[0], "record": change[1].to_xml()} + changesXML += self.ChangeXML % changeParams + params = {"comment": self.comment, "changes": changesXML} + return self.ChangeResourceRecordSetsBody % params + + def commit(self): + """Commit this change""" + if not self.connection: + import boto + self.connection = boto.connect_route53() + return self.connection.change_rrsets(self.hosted_zone_id, self.to_xml()) + + def endElement(self, name, value, connection): + """Overwritten to also add the NextRecordName, + NextRecordType and NextRecordIdentifier to the base object""" + if name == 'NextRecordName': + self.next_record_name = value + elif name == 'NextRecordType': + self.next_record_type = value + elif name == 'NextRecordIdentifier': + self.next_record_identifier = value + else: + return super(ResourceRecordSets, self).endElement(name, value, connection) + + def __iter__(self): + """Override the next function to support paging""" + results = super(ResourceRecordSets, self).__iter__() + truncated = self.is_truncated + while results: + for obj in results: + yield obj + if self.is_truncated: + self.is_truncated = False + results = self.connection.get_all_rrsets(self.hosted_zone_id, name=self.next_record_name, + type=self.next_record_type, + identifier=self.next_record_identifier) + else: + results = None + self.is_truncated = truncated + + +class Record(object): + """An individual ResourceRecordSet""" + + HealthCheckBody = """<HealthCheckId>%s</HealthCheckId>""" + + XMLBody = """<ResourceRecordSet> + <Name>%(name)s</Name> + <Type>%(type)s</Type> + %(weight)s + %(body)s + %(health_check)s + </ResourceRecordSet>""" + + WRRBody = """ + <SetIdentifier>%(identifier)s</SetIdentifier> + <Weight>%(weight)s</Weight> + """ + + RRRBody = """ + <SetIdentifier>%(identifier)s</SetIdentifier> + <Region>%(region)s</Region> + """ + + FailoverBody = """ + <SetIdentifier>%(identifier)s</SetIdentifier> + <Failover>%(failover)s</Failover> + """ + + ResourceRecordsBody = """ + <TTL>%(ttl)s</TTL> + <ResourceRecords> + %(records)s + </ResourceRecords>""" + + ResourceRecordBody = """<ResourceRecord> + <Value>%s</Value> + </ResourceRecord>""" + + AliasBody = """<AliasTarget> + <HostedZoneId>%(hosted_zone_id)s</HostedZoneId> + <DNSName>%(dns_name)s</DNSName> + %(eval_target_health)s + </AliasTarget>""" + + EvaluateTargetHealth = """<EvaluateTargetHealth>%s</EvaluateTargetHealth>""" + + def __init__(self, name=None, type=None, ttl=600, resource_records=None, + alias_hosted_zone_id=None, alias_dns_name=None, identifier=None, + weight=None, region=None, alias_evaluate_target_health=None, + health_check=None, failover=None): + self.name = name + self.type = type + self.ttl = ttl + if resource_records is None: + resource_records = [] + self.resource_records = resource_records + self.alias_hosted_zone_id = alias_hosted_zone_id + self.alias_dns_name = alias_dns_name + self.identifier = identifier + self.weight = weight + self.region = region + self.alias_evaluate_target_health = alias_evaluate_target_health + self.health_check = health_check + self.failover = failover + + def __repr__(self): + return '<Record:%s:%s:%s>' % (self.name, self.type, self.to_print()) + + def add_value(self, value): + """Add a resource record value""" + self.resource_records.append(value) + + def set_alias(self, alias_hosted_zone_id, alias_dns_name, + alias_evaluate_target_health=False): + """Make this an alias resource record set""" + self.alias_hosted_zone_id = alias_hosted_zone_id + self.alias_dns_name = alias_dns_name + self.alias_evaluate_target_health = alias_evaluate_target_health + + def to_xml(self): + """Spit this resource record set out as XML""" + if self.alias_hosted_zone_id is not None and self.alias_dns_name is not None: + # Use alias + if self.alias_evaluate_target_health is not None: + eval_target_health = self.EvaluateTargetHealth % ('true' if self.alias_evaluate_target_health else 'false') + else: + eval_target_health = "" + + body = self.AliasBody % {"hosted_zone_id": self.alias_hosted_zone_id, + "dns_name": self.alias_dns_name, + "eval_target_health": eval_target_health} + else: + # Use resource record(s) + records = "" + + for r in self.resource_records: + records += self.ResourceRecordBody % r + + body = self.ResourceRecordsBody % { + "ttl": self.ttl, + "records": records, + } + + weight = "" + + if self.identifier is not None and self.weight is not None: + weight = self.WRRBody % {"identifier": self.identifier, + "weight": self.weight} + elif self.identifier is not None and self.region is not None: + weight = self.RRRBody % {"identifier": self.identifier, + "region": self.region} + elif self.identifier is not None and self.failover is not None: + weight = self.FailoverBody % {"identifier": self.identifier, + "failover": self.failover} + + health_check = "" + if self.health_check is not None: + health_check = self.HealthCheckBody % (self.health_check) + + params = { + "name": self.name, + "type": self.type, + "weight": weight, + "body": body, + "health_check": health_check + } + return self.XMLBody % params + + def to_print(self): + rr = "" + if self.alias_hosted_zone_id is not None and self.alias_dns_name is not None: + # Show alias + rr = 'ALIAS ' + self.alias_hosted_zone_id + ' ' + self.alias_dns_name + if self.alias_evaluate_target_health is not None: + rr += ' (EvalTarget %s)' % self.alias_evaluate_target_health + else: + # Show resource record(s) + rr = ",".join(self.resource_records) + + if self.identifier is not None and self.weight is not None: + rr += ' (WRR id=%s, w=%s)' % (self.identifier, self.weight) + elif self.identifier is not None and self.region is not None: + rr += ' (LBR id=%s, region=%s)' % (self.identifier, self.region) + elif self.identifier is not None and self.failover is not None: + rr += ' (FAILOVER id=%s, failover=%s)' % (self.identifier, self.failover) + + return rr + + def endElement(self, name, value, connection): + if name == 'Name': + self.name = value + elif name == 'Type': + self.type = value + elif name == 'TTL': + self.ttl = value + elif name == 'Value': + self.resource_records.append(value) + elif name == 'HostedZoneId': + self.alias_hosted_zone_id = value + elif name == 'DNSName': + self.alias_dns_name = value + elif name == 'SetIdentifier': + self.identifier = value + elif name == 'EvaluateTargetHealth': + self.alias_evaluate_target_health = value.lower() == 'true' + elif name == 'Weight': + self.weight = value + elif name == 'Region': + self.region = value + elif name == 'Failover': + self.failover = value + elif name == 'HealthCheckId': + self.health_check = value + + def startElement(self, name, attrs, connection): + return None