o <&a8@sbdZddlZddlZddlmZmZmZeeZ dZ diiZ Gddde Z Gdd d e ZdS) zResolves regions and endpoints. This module implements endpoint resolution, including resolving endpoints for a given service and region and resolving the available endpoints for a service in a specific AWS partition. N) NoRegionErrorUnknownRegionErrorEndpointVariantErrorz{service}.{region}.{dnsSuffix} endpointsc@s0eZdZdZd ddZddZ  d d d ZdS) BaseEndpointResolverz3Resolves regions and endpoints. Must be subclassed.NcCt)a7Resolves an endpoint for a service and region combination. :type service_name: string :param service_name: Name of the service to resolve an endpoint for (e.g., s3) :type region_name: string :param region_name: Region/endpoint name to resolve (e.g., us-east-1) if no region is provided, the first found partition-wide endpoint will be used if available. :rtype: dict :return: Returns a dict containing the following keys: - partition: (string, required) Resolved partition name - endpointName: (string, required) Resolved endpoint name - hostname: (string, required) Hostname to use for this endpoint - sslCommonName: (string) sslCommonName to use for this endpoint. - credentialScope: (dict) Signature version 4 credential scope - region: (string) region name override when signing. - service: (string) service name override when signing. - signatureVersions: (list) A list of possible signature versions, including s3, v4, v2, and s3v4 - protocols: (list) A list of supported protocols (e.g., http, https) - ...: Other keys may be included as well based on the metadata NotImplementedError)self service_name region_namer 2/usr/lib/python3/dist-packages/botocore/regions.pyconstruct_endpoint!sz'BaseEndpointResolver.construct_endpointcCr)zLists the partitions available to the endpoint resolver. :return: Returns a list of partition names (e.g., ["aws", "aws-cn"]). r)r r r rget_available_partitions>sz-BaseEndpointResolver.get_available_partitionsawsFcCr)aLists the endpoint names of a particular partition. :type service_name: string :param service_name: Name of a service to list endpoint for (e.g., s3) :type partition_name: string :param partition_name: Name of the partition to limit endpoints to. (e.g., aws for the public AWS endpoints, aws-cn for AWS China endpoints, aws-us-gov for AWS GovCloud (US) Endpoints, etc. :type allow_non_regional: bool :param allow_non_regional: Set to True to include endpoints that are not regional endpoints (e.g., s3-external-1, fips-us-gov-west-1, etc). :return: Returns a list of endpoint names (e.g., ["us-east-1"]). r)r r partition_nameallow_non_regionalr r rget_available_endpointsEsz,BaseEndpointResolver.get_available_endpointsN)rF)__name__ __module__ __qualname____doc__rrrr r r rrs rc@seZdZdZddgZddZd%ddZd d Z  d&d dZ d'ddZ d(ddZ ddZ d)ddZ ddZ ddZddZddZdd Zd!d"Zd#d$Zd S)*EndpointResolverz7Resolves endpoints based on partition endpoint metadatazaws-isoz aws-iso-bcCsd|vrtd||_dS)zA :param endpoint_data: A dict of partition data. partitionsz%Missing "partitions" in endpoint dataN) ValueError_endpoint_data)r endpoint_datar r r__init___s zEndpointResolver.__init__rcCsB|jdD]}|d|krq|d}||vrq||dSdS)Nr partitionservicesr)r)r r rr r!r r rget_service_endpoints_datags z+EndpointResolver.get_service_endpoints_datacCs&g}|jdD] }||dq|S)Nrr )rappend)r resultr r r rrpsz)EndpointResolver.get_available_partitionsFNc Csg}|jdD]@}|d|krq|d}||vrq||d}|D]%} | |dv} |r=| r=||| |} | r<|| q!|sA| rF|| q!q|S)Nrr r!rregions)r_retrieve_variant_datar#) r r rrendpoint_variant_tagsr$r r!service_endpoints endpoint_nameis_regional_endpoint variant_datar r rrvs.      z(EndpointResolver.get_available_endpointscCs\|jdD]&}|d|kr+|r%||d|}|r$d|vr$|dSq|dSqdS)Nrr defaults dnsSuffix)rr&get)r rr'r variantr r rget_partition_dns_suffixs     z)EndpointResolver.get_partition_dns_suffixc Cs|dkr |r |dur d}|dur4d}|jdD] }|d|kr!|}q|dur2||||||d}|SdS|jdD]}|rE|d|jvrEq9||||||}|rT|Sq9dS)Ns3z us-east-1rr T)r_endpoint_for_partition!_UNSUPPORTED_DUALSTACK_PARTITIONS) r r r ruse_dualstack_endpointuse_fips_endpointvalid_partitionr r$r r rrs< z#EndpointResolver.construct_endpointcCs4|jdD]}|||r|dSqt|dd)Nrr z,No partition found for provided region_name.)r error_msg)r _region_matchr)r r r r r rget_partition_for_regions  z)EndpointResolver.get_partition_for_regionc Cs|d}|r||jvrd|}tdg|d|d|t} |dur.d| vr+| d}nt||| |||d} || dvrE|jdi| S|||sM|r| d} | d d } | rp| sptd ||| | | d <|jdi| Std |||jdi| SdS)Nr z@Dualstack endpoints are currently not supported for %s partition dualstacktagsr7r!partitionEndpoint)r r service_datar)r4r5risRegionalizedTz'Using partition endpoint for %s, %s: %sr)z*Creating a regex based endpoint for %s, %sr ) r3rr.DEFAULT_SERVICE_DATAr_resolver8LOGdebug) r r r r r4r5force_partitionrr7r>resolve_kwargspartition_endpointis_regionalizedr r rr2sJ     z(EndpointResolver._endpoint_for_partitioncCs0||dvrdSd|vrt|d|SdS)Nr%T regionRegexF)recompilematch)r r r r r rr8s zEndpointResolver._region_matchcCs>|dg}|D]}t|dt|kr|}|SqdS)Nvariantsr<)r.setcopy)r rr<rLr/r$r r rr&s z'EndpointResolver._retrieve_variant_datacCs$g}|r |d|r|d|S)Nr:fips)r#)r r4r5r<r r r_create_tag_lists   z!EndpointResolver._create_tag_listcCs4i}|||fD]}|||}|r|||q|Sr)r& _merge_keys)r r<rservice_defaultspartition_defaultsr$rLr/r r r_resolve_variant s  z!EndpointResolver._resolve_variantc Cs|di|i}|drtd||di}|di} |||} | rC|| ||| } | ikrBd||f} t| | dn|} d| vrO|d| d<|d| d<|| d <||| || | ||| d ||| d| d <d | vr||| d ||| d| d <| S) Nr deprecatedz5Client is configured with the deprecated endpoint: %sr,z+Endpoint does not exist for %s in region %sr;r-r endpointNamehostname sslCommonName)r.rBwarningrPrTrrQ_expand_template) r r r r>r)r4r5rrRrSr<r$r7r r rrAsP          zEndpointResolver._resolvecCs"|D] }||vr||||<qdSrr )r from_datar$keyr r rrQFs  zEndpointResolver._merge_keyscCs|j|||dS)N)serviceregionr-)format)r r templater r)r-r r rrZKsz!EndpointResolver._expand_template)r)rFNr)NNFF)F)rrrrr3rr"rrr0rr9r2r8r&rPrTrArQrZr r r rrZs4      ! / 2 r)rloggingrIbotocore.exceptionsrrr getLoggerrrBDEFAULT_URI_TEMPLATEr@objectrrr r r rs  ;