o
    ɶdC                     @   s  d dl mZ d dlZd dlZd dlZd dlmZ ddlmZ ddlm	Z	 d dl
mZ d dl
mZ d d	lmZmZmZ d d
lmZ d dlmZ ejZejZejZejZe	jZded< dZdZdZdZdZdZeeeefZ dZ!d"e!Z#ddiZ$ej%&dddZ'edg dZ(dZ)da*e(j+de(j,de(j-d e(j.diZ/e0e1Z2d!d" Z3d#d$ Z4d%d& Z5d'd( Z6dGd)d*Z7d+d, Z8d-d. Z9dHd/d0Z:d1d2 Z;d3d4 Z<d5d6 Z=d7d8 Z>d9d: Z?d;d< Z@d=d> ZAdId?d@ZBdJdAdBZCdCdD ZDdKdEdFZEdS )L    )absolute_importN)Enum   )regions_definitions)service_endpoints)six)requests)	HTTPErrorConnectionError
RetryError)HTTPAdapter)Retryzhttps://auth.{domain}Zauthz{region}.{secondLevelDomain}ZOCI_REGION_METADATAZrealmKeyZrealmDomainComponentZ	regionKeyZregionIdentifierzhttp://169.254.169.254/opc/v2z{}/instance/regionInfoZAuthorizationzBearer Oracle~z.ocizregions-config.jsonExternalSources)REGIONS_CFG_FILEENV_VARIMDSSECOND_LEVEL_DOMAIN_FALLBACKZOCI_DEFAULT_REALM FTc                 C   s(   |   }|tv r
dS |tvrt|S dS )NFTlowerREGIONS_SHORT_NAMESREGIONS_check_and_add_region_metadata)Zregion_nameregion r   /usr/lib/python3.10/site-packages/oci/regions.py	is_regionG   s   r   c                 C   s8   |   } | tv r
dS | tv rdS t| r| tv rdS dS )NTFr   r   r   r   r   is_region_short_nameQ   s   r   c                 C   s&   |   } t| std | S t|  S )NzBCould not find region information in lookups and any other sources)r   r   loggerdebugr   r   r   r   r   get_region_from_short_nameb   s
   
r"   c                 C   s.   |   } t| } t| std dS t|  S )NzTCannot find region information in lookups and other sources, defaulting to OC1 realmoc1)r   r"   r   r    r!   REGION_REALMSr   r   r   r   get_realm_from_regionl   s   
r%   c                 C   sP   |s|st d|rt| |||S | }|tv s!|tv s!t| t| |||S )a  Returns the base URl for a service, either in the given region or at the specified endpoint.

    If endpoint and region are provided, endpoint is used.

    If the region information is not available in the existing maps, following sources are checked in order:
    1. Regions Configuration File at ~/.oci/regions-config.json
    2. Region Metadata Environment variable
    3. Instance Metadata Service

    Lookup from Instance Metadata Service is disabled by default. To enable, call enable_instance_metadata_service()

    The region metadata schema is:
    {
        "realmKey" : string,
        "realmDomainComponent" : string,
        "regionKey" : string,
        "regionIdentifier" : string
    }

    For example,  for the Sydney OC1 region, the schema would be filled out as follows:
    {
        "realmKey" : "OC1",
        "realmDomainComponent" : "oraclecloud.com",
        "regionKey" : "SYD",
        "regionIdentifier" : "ap-sydney-1"
     }

    If the region still cannot be resolved, we fall back to OC1 realm
    z+Must supply either a region or an endpoint.)
ValueError_format_endpointr   r   r   r   _endpoint_for)servicer   endpointservice_endpoint_templateendpoint_service_namer   r   r   endpoint_forx   s   r-   c                   C   s   t d ttj d S )Nz*Disabling region metadata lookup from IMDSr    r!   _set_source_has_been_readr   r   r   r   r   r   skip_instance_metadata_service   s   
r0   c                   C   s   t d ttjd d S )Nz)Enabling region metadata lookup from IMDSFr.   r   r   r   r    enable_instance_metadata_service   s   
r1   c                 C   s   |t | < d S N_has_been_read_external_sources)sourcevaluer   r   r   r/      s   r/   c                 C   s   t |  S r2   r3   )r5   r   r   r   _get_source_has_been_read   s   r7   c                 C   s   t tjstjtattj t	| rt
d|  dS t| r,t
d|  dS t| r:t
d|  dS d| v rHt
d|  dS trUt
d| t dS t
d	|  dS )
NzAAdded metadata information for {} region from regions config fileTzBAdded metadata information for {} region from environment variablez2Added metadata information for {} region from IMDS.zOUnknown regionId '{}', contains '.', will use it as domain (<service>.<domain>)FzFUnknown regionId '{}', default realm is defined, will fallback to '{}'z4Unknown regionId '{}', will assume it's in Realm OC1)r7   r   r   osenvirongetDEFAULT_REALM_ENV_VARNAMEsecond_level_domain_fallbackr/   "_set_region_metadata_from_cfg_filer    r!   format!_set_region_metadata_from_env_var*_set_region_from_instance_metadata_servicer   r   r   r   r      s(   

r   c           	   
   C   sF  t tjrdS ttj tjt}tj|rt	
d zt|d}| }W d    n1 s2w   Y  W n ttfyU } zt	
d| W Y d }~dS d }~ww zddlm} W n tyi   t}Y nw zt|}W n |y } zt	
d| W Y d }~dS d }~ww d}|D ]}t|rt|| rd}q|S dS )	NFz Regions configuration file foundrz>Reading regions configuration file failed because of error: {}r   JSONDecodeErrorzODecoding JSON array from regions configuration file failed because of error: {}T)r7   r   r   r/   r9   path
expanduserREGIONS_CONFIG_FILE_PATHisfiler    r!   openreadOSErrorIOErrorr?   json.decoderrD   ImportErrorr&   jsonloads_check_valid_schema!_add_region_information_to_lookup)	r   Zexpanded_file_locationZregions_config_fileZregions_metadata_rawerD   Zregions_metadata_arrayZaddedregion_metadatar   r   r   r>      sH   




r>   c              
   C   s   t tjrdS ttj tjtrVzddlm	} W n t
y%   t}Y nw zttjt}W n |yL } ztd| W Y d }~dS d }~ww t|rVt|| S dS )NFr   rC   zCDecoding JSON from environment variable failed because of error: {})r7   r   r   r/   r9   r:   r;    OCI_REGION_METADATA_ENV_VAR_NAMErM   rD   rN   r&   rO   rP   r    r!   r?   rQ   rR   )r   rD   rT   rS   r   r   r   r@      s&   


r@   c              
   C   sZ  t tjrdS ttj z-tdg ddddd}t }|tt	|d |j
tdtd}|j}td	| W n tttfyW } ztd
| W Y d }~dS d }~ww |jdkrktdt|j|j dS zddlm} W n ty~   t}Y nw zt|}W n |y } ztd| W Y d }~dS d }~ww t|rt|| S dS )NF   )i  i  i  i  i  r   )totalZstatus_forcelistrJ   connectstatus)Zmax_retries)
   <   )timeoutheadersz%Region metadata blob from IMDS is: {}z0Failed to call IMDS service because of error: {}   z1HTTP Get Failed: URL: {}, Status: {}, Message: {}rC   z4Decoding JSON from IMDS service because of error: {})r7   r   r   r/   r   r   ZSessionZmountGET_REGION_URLr   r;   METADATA_AUTH_HEADERStextr    r!   r?   r	   r
   r   Zstatus_coderM   rD   rN   r&   rO   rP   rQ   rR   )r   Zretry_strategysresponseZregion_metadata_rawrS   rD   rT   r   r   r   rA     sN   



rA   c                 C   sN   t D ]"}|| vrtd|  dS | | dkr$td|  dS qdS )Nz#Key {} not found in region metadataFr   z,Value for key {} in region metadata is emptyT)REGION_METADATA_KEYSr    r!   r?   )rT   keyr   r   r   rQ   D  s   rQ   c                 C   s   dd t | D } | t tvr| t t| t < | t tvr&| t t| t < | t tvr4| t t| t < | t t	vrAt	
| t  || t ksM|| t krOdS dS )Nc                 S   s   i | ]	\}}||  qS r   )r   ).0kvr   r   r   
<dictcomp>R  s    z5_add_region_information_to_lookup.<locals>.<dictcomp>TF)r   Z	iteritemsREGION_KEY_PROPERTY_NAMEr   REGION_IDENTIFIER_PROPERTY_NAMEr$   REALM_KEY_PROPERTY_NAMEREALMS$REALM_DOMAIN_COMPONENT_PROPERTY_NAMEr   append)rT   r   r   r   r   rR   O  s   rR   c                 C   s^   |t v rt | }d|v r)|r d||}td||| |S t| |||}|S t| ||S )Nr8   zhttps://{}.{}zbConstruction endpoint from endpoint service name {} and region {} with '.' as domain. Endpoint: {})r   r?   r    r!   r'   	_endpoint)r)   r   r+   r,   r*   r   r   r   r(   f  s   r(   c                 C   s@   |r|}|r| d|}| dt|S t| tj|t|dS )N{region}z{secondLevelDomain})r   ZsecondLevelDomain)replace_second_level_domainr'   DOMAIN_FORMATr?   )r)   r   r+   r*   r   r   r   rp   x  s   rp   c                 C   s`   t tjstjtattj | t	
 v rt	|  }t| S tr*ttd< d}t| S d}t| S )Nunknownr#   )r7   r   r   r9   r:   r;   r<   r=   r/   r$   keysrm   )r   realmr   r   r   rs     s   


rs   c                 C   s   d }|   tvr.|d u r|rd| d }ntd| |d}|dkr-|d | d }nt|    }|d u r@td| ||j|d}|S )	Nzhttps://z	.{domain}zUnknown service {!r}rq   z{domain}zMUnable to format endpoint for service, {} , and service_endpoint_template, {})domain)r   SERVICE_ENDPOINTSr&   r?   find)r)   ry   r+   r,   Z
url_formatposr*   r   r   r   r'     s   
r'   )NNNN)T)NNNr2   )NN)F
__future__r   r9   rO   loggingenumr   r   r   r   Zoci._vendorr   r   Zoci._vendor.requests.exceptionsr	   r
   r   Zoci._vendor.requests.adaptersr   Zoci._vendor.urllib3.util.retryr   r   r$   rm   r   rz   rt   rU   rl   rn   rj   rk   rd   ZMETADATA_URL_BASEr?   r_   r`   rE   joinrG   r   r<   r=   r   r   r   r   r4   	getLogger__name__r    r   r   r"   r%   r-   r0   r1   r/   r7   r   r>   r@   rA   rQ   rR   r(   rp   rs   r'   r   r   r   r   <module>   sz   




,
(0

