Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/boto/endpoints.py @ 0:26e78fe6e8c4 draft
"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author | shellac |
---|---|
date | Sat, 02 May 2020 07:14:21 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.7/site-packages/boto/endpoints.py Sat May 02 07:14:21 2020 -0400 @@ -0,0 +1,239 @@ +# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You +# may not use this file except in compliance with the License. A copy of +# the License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file is +# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +# ANY KIND, either express or implied. See the License for the specific +# language governing permissions and limitations under the License. +import boto.vendored.regions.regions as _regions + + +class _CompatEndpointResolver(_regions.EndpointResolver): + """Endpoint resolver which handles boto2 compatibility concerns. + + This is NOT intended for external use whatsoever. + """ + + _DEFAULT_SERVICE_RENAMES = { + # The botocore resolver is based on endpoint prefix. + # These don't always sync up to the name that boto2 uses. + # A mapping can be provided that handles the mapping between + # "service names" and endpoint prefixes. + 'awslambda': 'lambda', + 'cloudwatch': 'monitoring', + 'ses': 'email', + 'ec2containerservice': 'ecs', + 'configservice': 'config', + } + + def __init__(self, endpoint_data, service_rename_map=None): + """ + :type endpoint_data: dict + :param endpoint_data: Regions and endpoints data in the same format + as is used by botocore / boto3. + + :type service_rename_map: dict + :param service_rename_map: A mapping of boto2 service name to + endpoint prefix. + """ + super(_CompatEndpointResolver, self).__init__(endpoint_data) + if service_rename_map is None: + service_rename_map = self._DEFAULT_SERVICE_RENAMES + # Mapping of boto2 service name to endpoint prefix + self._endpoint_prefix_map = service_rename_map + # Mapping of endpoint prefix to boto2 service name + self._service_name_map = dict( + (v, k) for k, v in service_rename_map.items()) + + def get_available_endpoints(self, service_name, partition_name='aws', + allow_non_regional=False): + endpoint_prefix = self._endpoint_prefix(service_name) + return super(_CompatEndpointResolver, self).get_available_endpoints( + endpoint_prefix, partition_name, allow_non_regional) + + def get_all_available_regions(self, service_name): + """Retrieve every region across partitions for a service.""" + regions = set() + endpoint_prefix = self._endpoint_prefix(service_name) + + # Get every region for every partition in the new endpoint format + for partition_name in self.get_available_partitions(): + if self._is_global_service(service_name, partition_name): + # Global services are available in every region in the + # partition in which they are considered global. + partition = self._get_partition_data(partition_name) + regions.update(partition['regions'].keys()) + continue + else: + regions.update( + self.get_available_endpoints( + endpoint_prefix, partition_name) + ) + + return list(regions) + + def construct_endpoint(self, service_name, region_name=None): + endpoint_prefix = self._endpoint_prefix(service_name) + return super(_CompatEndpointResolver, self).construct_endpoint( + endpoint_prefix, region_name) + + def get_available_services(self): + """Get a list of all the available services in the endpoints file(s)""" + services = set() + + for partition in self._endpoint_data['partitions']: + services.update(partition['services'].keys()) + + return [self._service_name(s) for s in services] + + def _is_global_service(self, service_name, partition_name='aws'): + """Determines whether a service uses a global endpoint. + + In theory a service can be 'global' in one partition but regional in + another. In practice, each service is all global or all regional. + """ + endpoint_prefix = self._endpoint_prefix(service_name) + partition = self._get_partition_data(partition_name) + service = partition['services'].get(endpoint_prefix, {}) + return 'partitionEndpoint' in service + + def _get_partition_data(self, partition_name): + """Get partition information for a particular partition. + + This should NOT be used to get service endpoint data because it only + loads from the new endpoint format. It should only be used for + partition metadata and partition specific service metadata. + + :type partition_name: str + :param partition_name: The name of the partition to search for. + + :returns: Partition info from the new endpoints format. + :rtype: dict or None + """ + for partition in self._endpoint_data['partitions']: + if partition['partition'] == partition_name: + return partition + raise ValueError( + "Could not find partition data for: %s" % partition_name) + + def _endpoint_prefix(self, service_name): + """Given a boto2 service name, get the endpoint prefix.""" + return self._endpoint_prefix_map.get(service_name, service_name) + + def _service_name(self, endpoint_prefix): + """Given an endpoint prefix, get the boto2 service name.""" + return self._service_name_map.get(endpoint_prefix, endpoint_prefix) + + +class BotoEndpointResolver(object): + """Resolves endpoint hostnames for AWS services. + + This is NOT intended for external use. + """ + + def __init__(self, endpoint_data, service_rename_map=None): + """ + :type endpoint_data: dict + :param endpoint_data: Regions and endpoints data in the same format + as is used by botocore / boto3. + + :type service_rename_map: dict + :param service_rename_map: A mapping of boto2 service name to + endpoint prefix. + """ + self._resolver = _CompatEndpointResolver( + endpoint_data, service_rename_map) + + def resolve_hostname(self, service_name, region_name): + """Resolve the hostname for a service in a particular region. + + :type service_name: str + :param service_name: The service to look up. + + :type region_name: str + :param region_name: The region to find the endpoint for. + + :return: The hostname for the given service in the given region. + """ + endpoint = self._resolver.construct_endpoint(service_name, region_name) + if endpoint is None: + return None + return endpoint.get('sslCommonName', endpoint['hostname']) + + def get_all_available_regions(self, service_name): + """Get all the regions a service is available in. + + :type service_name: str + :param service_name: The service to look up. + + :rtype: list of str + :return: A list of all the regions the given service is available in. + """ + return self._resolver.get_all_available_regions(service_name) + + def get_available_services(self): + """Get all the services supported by the endpoint data. + + :rtype: list of str + :return: A list of all the services explicitly contained within the + endpoint data provided during instantiation. + """ + return self._resolver.get_available_services() + + +class StaticEndpointBuilder(object): + """Builds a static mapping of endpoints in the legacy format.""" + + def __init__(self, resolver): + """ + :type resolver: BotoEndpointResolver + :param resolver: An endpoint resolver. + """ + self._resolver = resolver + + def build_static_endpoints(self, service_names=None): + """Build a set of static endpoints in the legacy boto2 format. + + :param service_names: The names of the services to build. They must + use the names that boto2 uses, not boto3, e.g "ec2containerservice" + and not "ecs". If no service names are provided, all available + services will be built. + + :return: A dict consisting of:: + {"service": {"region": "full.host.name"}} + """ + if service_names is None: + service_names = self._resolver.get_available_services() + + static_endpoints = {} + for name in service_names: + endpoints_for_service = self._build_endpoints_for_service(name) + if endpoints_for_service: + # It's possible that when we try to build endpoints for + # services we get an empty hash. In that case we don't + # bother adding it to the final list of static endpoints. + static_endpoints[name] = endpoints_for_service + self._handle_special_cases(static_endpoints) + return static_endpoints + + def _build_endpoints_for_service(self, service_name): + # Given a service name, 'ec2', build a dict of + # 'region' -> 'hostname' + endpoints = {} + regions = self._resolver.get_all_available_regions(service_name) + for region_name in regions: + endpoints[region_name] = self._resolver.resolve_hostname( + service_name, region_name) + return endpoints + + def _handle_special_cases(self, static_endpoints): + # cloudsearchdomain endpoints use the exact same set of endpoints as + # cloudsearch. + if 'cloudsearch' in static_endpoints: + cloudsearch_endpoints = static_endpoints['cloudsearch'] + static_endpoints['cloudsearchdomain'] = cloudsearch_endpoints