Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/boto/route53/connection.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/boto/route53/connection.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,613 +0,0 @@ -# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/ -# Copyright (c) 2010, Eucalyptus Systems, Inc. -# Copyright (c) 2011 Blue Pines Technologies LLC, Brad Carleton -# www.bluepines.org -# Copyright (c) 2012 42 Lines Inc., Jim Browne -# -# 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. -# - -from boto.route53 import exception -import random -import uuid -import xml.sax - -import boto -from boto.connection import AWSAuthConnection -from boto import handler -import boto.jsonresponse -from boto.route53.record import ResourceRecordSets -from boto.route53.zone import Zone -from boto.compat import six, urllib - - -HZXML = """<?xml version="1.0" encoding="UTF-8"?> -<CreateHostedZoneRequest xmlns="%(xmlns)s"> - <Name>%(name)s</Name> - <CallerReference>%(caller_ref)s</CallerReference> - <HostedZoneConfig> - <Comment>%(comment)s</Comment> - </HostedZoneConfig> -</CreateHostedZoneRequest>""" - -HZPXML = """<?xml version="1.0" encoding="UTF-8"?> -<CreateHostedZoneRequest xmlns="%(xmlns)s"> - <Name>%(name)s</Name> - <VPC> - <VPCId>%(vpc_id)s</VPCId> - <VPCRegion>%(vpc_region)s</VPCRegion> - </VPC> - <CallerReference>%(caller_ref)s</CallerReference> - <HostedZoneConfig> - <Comment>%(comment)s</Comment> - </HostedZoneConfig> -</CreateHostedZoneRequest>""" - -# boto.set_stream_logger('dns') - - -class Route53Connection(AWSAuthConnection): - DefaultHost = 'route53.amazonaws.com' - """The default Route53 API endpoint to connect to.""" - - Version = '2013-04-01' - """Route53 API version.""" - - XMLNameSpace = 'https://route53.amazonaws.com/doc/2013-04-01/' - """XML schema for this Route53 API version.""" - - def __init__(self, aws_access_key_id=None, aws_secret_access_key=None, - port=None, proxy=None, proxy_port=None, - host=DefaultHost, debug=0, security_token=None, - validate_certs=True, https_connection_factory=None, - profile_name=None): - super(Route53Connection, self).__init__( - host, - aws_access_key_id, aws_secret_access_key, - True, port, proxy, proxy_port, debug=debug, - security_token=security_token, - validate_certs=validate_certs, - https_connection_factory=https_connection_factory, - profile_name=profile_name) - - def _required_auth_capability(self): - return ['route53'] - - def make_request(self, action, path, headers=None, data='', params=None): - if params: - pairs = [] - for key, val in six.iteritems(params): - if val is None: - continue - pairs.append(key + '=' + urllib.parse.quote(str(val))) - path += '?' + '&'.join(pairs) - return super(Route53Connection, self).make_request( - action, path, headers, data, - retry_handler=self._retry_handler) - - # Hosted Zones - - def get_all_hosted_zones(self, start_marker=None, zone_list=None): - """ - Returns a Python data structure with information about all - Hosted Zones defined for the AWS account. - - :param int start_marker: start marker to pass when fetching additional - results after a truncated list - :param list zone_list: a HostedZones list to prepend to results - """ - params = {} - if start_marker: - params = {'marker': start_marker} - response = self.make_request('GET', '/%s/hostedzone' % self.Version, - params=params) - body = response.read() - boto.log.debug(body) - if response.status >= 300: - raise exception.DNSServerError(response.status, - response.reason, - body) - e = boto.jsonresponse.Element(list_marker='HostedZones', - item_marker=('HostedZone',)) - h = boto.jsonresponse.XmlHandler(e, None) - h.parse(body) - if zone_list: - e['ListHostedZonesResponse']['HostedZones'].extend(zone_list) - while 'NextMarker' in e['ListHostedZonesResponse']: - next_marker = e['ListHostedZonesResponse']['NextMarker'] - zone_list = e['ListHostedZonesResponse']['HostedZones'] - e = self.get_all_hosted_zones(next_marker, zone_list) - return e - - def get_hosted_zone(self, hosted_zone_id): - """ - Get detailed information about a particular Hosted Zone. - - :type hosted_zone_id: str - :param hosted_zone_id: The unique identifier for the Hosted Zone - - """ - uri = '/%s/hostedzone/%s' % (self.Version, hosted_zone_id) - response = self.make_request('GET', uri) - body = response.read() - boto.log.debug(body) - if response.status >= 300: - raise exception.DNSServerError(response.status, - response.reason, - body) - e = boto.jsonresponse.Element(list_marker='NameServers', - item_marker=('NameServer',)) - h = boto.jsonresponse.XmlHandler(e, None) - h.parse(body) - return e - - def get_hosted_zone_by_name(self, hosted_zone_name): - """ - Get detailed information about a particular Hosted Zone. - - :type hosted_zone_name: str - :param hosted_zone_name: The fully qualified domain name for the Hosted - Zone - - """ - if hosted_zone_name[-1] != '.': - hosted_zone_name += '.' - all_hosted_zones = self.get_all_hosted_zones() - for zone in all_hosted_zones['ListHostedZonesResponse']['HostedZones']: - # check that they gave us the FQDN for their zone - if zone['Name'] == hosted_zone_name: - return self.get_hosted_zone(zone['Id'].split('/')[-1]) - - def create_hosted_zone(self, domain_name, caller_ref=None, comment='', - private_zone=False, vpc_id=None, vpc_region=None): - """ - Create a new Hosted Zone. Returns a Python data structure with - information about the newly created Hosted Zone. - - :type domain_name: str - :param domain_name: The name of the domain. This should be a - fully-specified domain, and should end with a final period - as the last label indication. If you omit the final period, - Amazon Route 53 assumes the domain is relative to the root. - This is the name you have registered with your DNS registrar. - It is also the name you will delegate from your registrar to - the Amazon Route 53 delegation servers returned in - response to this request.A list of strings with the image - IDs wanted. - - :type caller_ref: str - :param caller_ref: A unique string that identifies the request - and that allows failed CreateHostedZone requests to be retried - without the risk of executing the operation twice. If you don't - provide a value for this, boto will generate a Type 4 UUID and - use that. - - :type comment: str - :param comment: Any comments you want to include about the hosted - zone. - - :type private_zone: bool - :param private_zone: Set True if creating a private hosted zone. - - :type vpc_id: str - :param vpc_id: When creating a private hosted zone, the VPC Id to - associate to is required. - - :type vpc_region: str - :param vpc_region: When creating a private hosted zone, the region - of the associated VPC is required. - - """ - if caller_ref is None: - caller_ref = str(uuid.uuid4()) - if private_zone: - params = {'name': domain_name, - 'caller_ref': caller_ref, - 'comment': comment, - 'vpc_id': vpc_id, - 'vpc_region': vpc_region, - 'xmlns': self.XMLNameSpace} - xml_body = HZPXML % params - else: - params = {'name': domain_name, - 'caller_ref': caller_ref, - 'comment': comment, - 'xmlns': self.XMLNameSpace} - xml_body = HZXML % params - uri = '/%s/hostedzone' % self.Version - response = self.make_request('POST', uri, - {'Content-Type': 'text/xml'}, xml_body) - body = response.read() - boto.log.debug(body) - if response.status == 201: - e = boto.jsonresponse.Element(list_marker='NameServers', - item_marker=('NameServer',)) - h = boto.jsonresponse.XmlHandler(e, None) - h.parse(body) - return e - else: - raise exception.DNSServerError(response.status, - response.reason, - body) - - def delete_hosted_zone(self, hosted_zone_id): - """ - Delete the hosted zone specified by the given id. - - :type hosted_zone_id: str - :param hosted_zone_id: The hosted zone's id - - """ - uri = '/%s/hostedzone/%s' % (self.Version, hosted_zone_id) - response = self.make_request('DELETE', uri) - body = response.read() - boto.log.debug(body) - if response.status not in (200, 204): - raise exception.DNSServerError(response.status, - response.reason, - body) - e = boto.jsonresponse.Element() - h = boto.jsonresponse.XmlHandler(e, None) - h.parse(body) - return e - - # Health checks - - POSTHCXMLBody = """<CreateHealthCheckRequest xmlns="%(xmlns)s"> - <CallerReference>%(caller_ref)s</CallerReference> - %(health_check)s - </CreateHealthCheckRequest>""" - - def create_health_check(self, health_check, caller_ref=None): - """ - Create a new Health Check - - :type health_check: HealthCheck - :param health_check: HealthCheck object - - :type caller_ref: str - :param caller_ref: A unique string that identifies the request - and that allows failed CreateHealthCheckRequest requests to be retried - without the risk of executing the operation twice. If you don't - provide a value for this, boto will generate a Type 4 UUID and - use that. - - """ - if caller_ref is None: - caller_ref = str(uuid.uuid4()) - uri = '/%s/healthcheck' % self.Version - params = {'xmlns': self.XMLNameSpace, - 'caller_ref': caller_ref, - 'health_check': health_check.to_xml() - } - xml_body = self.POSTHCXMLBody % params - response = self.make_request('POST', uri, {'Content-Type': 'text/xml'}, xml_body) - body = response.read() - boto.log.debug(body) - if response.status == 201: - e = boto.jsonresponse.Element() - h = boto.jsonresponse.XmlHandler(e, None) - h.parse(body) - return e - else: - raise exception.DNSServerError(response.status, response.reason, body) - - def get_list_health_checks(self, maxitems=None, marker=None): - """ - Return a list of health checks - - :type maxitems: int - :param maxitems: Maximum number of items to return - - :type marker: str - :param marker: marker to get next set of items to list - - """ - - params = {} - if maxitems is not None: - params['maxitems'] = maxitems - if marker is not None: - params['marker'] = marker - - uri = '/%s/healthcheck' % (self.Version, ) - response = self.make_request('GET', uri, params=params) - body = response.read() - boto.log.debug(body) - if response.status >= 300: - raise exception.DNSServerError(response.status, - response.reason, - body) - e = boto.jsonresponse.Element(list_marker='HealthChecks', - item_marker=('HealthCheck',)) - h = boto.jsonresponse.XmlHandler(e, None) - h.parse(body) - return e - - def get_checker_ip_ranges(self): - """ - Return a list of Route53 healthcheck IP ranges - """ - uri = '/%s/checkeripranges' % self.Version - response = self.make_request('GET', uri) - body = response.read() - boto.log.debug(body) - if response.status >= 300: - raise exception.DNSServerError(response.status, - response.reason, - body) - e = boto.jsonresponse.Element(list_marker='CheckerIpRanges', item_marker=('member',)) - h = boto.jsonresponse.XmlHandler(e, None) - h.parse(body) - return e - - def delete_health_check(self, health_check_id): - """ - Delete a health check - - :type health_check_id: str - :param health_check_id: ID of the health check to delete - - """ - uri = '/%s/healthcheck/%s' % (self.Version, health_check_id) - response = self.make_request('DELETE', uri) - body = response.read() - boto.log.debug(body) - if response.status not in (200, 204): - raise exception.DNSServerError(response.status, - response.reason, - body) - e = boto.jsonresponse.Element() - h = boto.jsonresponse.XmlHandler(e, None) - h.parse(body) - return e - - # Resource Record Sets - - def get_all_rrsets(self, hosted_zone_id, type=None, - name=None, identifier=None, maxitems=None): - """ - Retrieve the Resource Record Sets defined for this Hosted Zone. - Returns the raw XML data returned by the Route53 call. - - :type hosted_zone_id: str - :param hosted_zone_id: The unique identifier for the Hosted Zone - - :type type: str - :param type: The type of resource record set to begin the record - listing from. Valid choices are: - - * A - * AAAA - * CNAME - * MX - * NS - * PTR - * SOA - * SPF - * SRV - * TXT - - Valid values for weighted resource record sets: - - * A - * AAAA - * CNAME - * TXT - - Valid values for Zone Apex Aliases: - - * A - * AAAA - - :type name: str - :param name: The first name in the lexicographic ordering of domain - names to be retrieved - - :type identifier: str - :param identifier: In a hosted zone that includes weighted resource - record sets (multiple resource record sets with the same DNS - name and type that are differentiated only by SetIdentifier), - if results were truncated for a given DNS name and type, - the value of SetIdentifier for the next resource record - set that has the current DNS name and type - - :type maxitems: int - :param maxitems: The maximum number of records - - """ - params = {'type': type, 'name': name, - 'identifier': identifier, 'maxitems': maxitems} - uri = '/%s/hostedzone/%s/rrset' % (self.Version, hosted_zone_id) - response = self.make_request('GET', uri, params=params) - body = response.read() - boto.log.debug(body) - if response.status >= 300: - raise exception.DNSServerError(response.status, - response.reason, - body) - rs = ResourceRecordSets(connection=self, hosted_zone_id=hosted_zone_id) - h = handler.XmlHandler(rs, self) - xml.sax.parseString(body, h) - return rs - - def change_rrsets(self, hosted_zone_id, xml_body): - """ - Create or change the authoritative DNS information for this - Hosted Zone. - Returns a Python data structure with information about the set of - changes, including the Change ID. - - :type hosted_zone_id: str - :param hosted_zone_id: The unique identifier for the Hosted Zone - - :type xml_body: str - :param xml_body: The list of changes to be made, defined in the - XML schema defined by the Route53 service. - - """ - uri = '/%s/hostedzone/%s/rrset' % (self.Version, hosted_zone_id) - response = self.make_request('POST', uri, - {'Content-Type': 'text/xml'}, - xml_body) - body = response.read() - boto.log.debug(body) - if response.status >= 300: - raise exception.DNSServerError(response.status, - response.reason, - body) - e = boto.jsonresponse.Element() - h = boto.jsonresponse.XmlHandler(e, None) - h.parse(body) - return e - - def get_change(self, change_id): - """ - Get information about a proposed set of changes, as submitted - by the change_rrsets method. - Returns a Python data structure with status information about the - changes. - - :type change_id: str - :param change_id: The unique identifier for the set of changes. - This ID is returned in the response to the change_rrsets method. - - """ - uri = '/%s/change/%s' % (self.Version, change_id) - response = self.make_request('GET', uri) - body = response.read() - boto.log.debug(body) - if response.status >= 300: - raise exception.DNSServerError(response.status, - response.reason, - body) - e = boto.jsonresponse.Element() - h = boto.jsonresponse.XmlHandler(e, None) - h.parse(body) - return e - - def create_zone(self, name, private_zone=False, - vpc_id=None, vpc_region=None): - """ - Create a new Hosted Zone. Returns a Zone object for the newly - created Hosted Zone. - - :type name: str - :param name: The name of the domain. This should be a - fully-specified domain, and should end with a final period - as the last label indication. If you omit the final period, - Amazon Route 53 assumes the domain is relative to the root. - This is the name you have registered with your DNS registrar. - It is also the name you will delegate from your registrar to - the Amazon Route 53 delegation servers returned in - response to this request. - - :type private_zone: bool - :param private_zone: Set True if creating a private hosted zone. - - :type vpc_id: str - :param vpc_id: When creating a private hosted zone, the VPC Id to - associate to is required. - - :type vpc_region: str - :param vpc_region: When creating a private hosted zone, the region - of the associated VPC is required. - """ - zone = self.create_hosted_zone(name, private_zone=private_zone, - vpc_id=vpc_id, vpc_region=vpc_region) - return Zone(self, zone['CreateHostedZoneResponse']['HostedZone']) - - def get_zone(self, name): - """ - Returns a Zone object for the specified Hosted Zone. - - :param name: The name of the domain. This should be a - fully-specified domain, and should end with a final period - as the last label indication. - """ - name = self._make_qualified(name) - for zone in self.get_zones(): - if name == zone.name: - return zone - - def get_zones(self): - """ - Returns a list of Zone objects, one for each of the Hosted - Zones defined for the AWS account. - - :rtype: list - :returns: A list of Zone objects. - - """ - zones = self.get_all_hosted_zones() - return [Zone(self, zone) for zone in - zones['ListHostedZonesResponse']['HostedZones']] - - def _make_qualified(self, value): - """ - Ensure passed domain names end in a period (.) character. - This will usually make a domain fully qualified. - """ - if type(value) in [list, tuple, set]: - new_list = [] - for record in value: - if record and not record[-1] == '.': - new_list.append("%s." % record) - else: - new_list.append(record) - return new_list - else: - value = value.strip() - if value and not value[-1] == '.': - value = "%s." % value - return value - - def _retry_handler(self, response, i, next_sleep): - status = None - boto.log.debug("Saw HTTP status: %s" % response.status) - - if response.status == 400: - body = response.read() - - # We need to parse the error first - err = exception.DNSServerError( - response.status, - response.reason, - body) - if err.error_code: - # This is a case where we need to ignore a 400 error, as - # Route53 returns this. See - # http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html - if not err.error_code in ( - 'PriorRequestNotComplete', - 'Throttling', - 'ServiceUnavailable', - 'RequestExpired'): - return status - msg = "%s, retry attempt %s" % ( - err.error_code, - i - ) - next_sleep = min(random.random() * (2 ** i), - boto.config.get('Boto', 'max_retry_delay', 60)) - i += 1 - status = (msg, i, next_sleep) - - return status