a fU@s$ddlmZddlZddlZddlZddlmZddlmZddlm Z ddl m Z ddl m Z dd l mZdd lmZmZmZdd lmZdd lmZejaejaejaejae jZd ed<dZdZdZdZdZ dZ!eee e!fZ"dZ#d$e#Z%ddiZ&ej'(dddZ)edgdZ*dZ+da,e*j-d e*j.d e*j/d!e*j0d iZ1d Z2d"Z3d a4dZ5e6e7Z8d#d$Z9d%d&Z:d'd(Z;d)d*Zd/d0Z?d1d2Z@dTd3d4ZAd5d6ZBd7d8ZCd9d:ZDd;d<ZEd=d>ZFd?d@ZGdAdBZHdCdDZIdEdFZJdGdHZKdUdIdJZLdVdKdLZMdWdMdNZNdOdPZOdXdQdRZPdS)Y)absolute_importN)Enum)regions_definitions)service_endpoints)InvalidAlloyConfig)six)requests) HTTPErrorConnectionError RetryError) HTTPAdapter)Retryzhttps://auth.{domain}Zauthz{region}.{secondLevelDomain}ZOCI_REGION_METADATAZrealmKeyZrealmDomainComponentZ regionKeyZregionIdentifierzhttp://169.254.169.254/opc/v2z{}/instance/regionInfoZ Authorizationz Bearer Oracle~z.ocizregions-config.jsonExternalSources)REGIONS_CFG_FILEENV_VARIMDSSECOND_LEVEL_DOMAIN_FALLBACKZOCI_DEFAULT_REALMFTZOCI_ALLOY_REGION_COEXISTcCs(|}|tvrdS|tvr$t|SdS)NFTlowerREGIONS_SHORT_NAMESREGIONS_check_and_add_region_metadata)Z region_nameregionr//usr/lib/python3.9/site-packages/oci/regions.py is_regionOs rcCs8|}|tvrdS|tvr dSt|r4|tvr4dSdS)NTFrrrrris_region_short_nameYsr cCs&|}t|std|St|S)NzBCould not find region information in lookups and any other sources)rr loggerdebugrrrrrget_region_from_short_namejs  r#cCs2|}t|}t|s&tddSt|SdS)NzTCannot find region information in lookups and other sources, defaulting to OC1 realmoc1)rr#rr!r" REGION_REALMSrrrrget_realm_from_regionts  r&cCsP|s|std|r"t||||S|}|tvsB|tvsBt|t||||S)aCReturns 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. If alloy mode is enabled, and OCI_ALLOY_REGION_COEXIST is not set, only the alloy regions are available. If you want to access OCI and alloy regions at the same time, please set OCI_ALLOY_REGION_COEXIST to True. Fallback to OC1 realm is not available when OCI_ALLOY_REGION_COEXIST is not set. z+Must supply either a region or an endpoint.) ValueError_format_endpointrrrr _endpoint_for)servicerendpointservice_endpoint_templateendpoint_service_namerrr endpoint_fors#r.cCstdttjdS)Nz*Disabling region metadata lookup from IMDSr!r"_set_source_has_been_readrrrrrrskip_instance_metadata_services r1cCstdttjddS)Nz)Enabling region metadata lookup from IMDSFr/rrrr enable_instance_metadata_services r2cCsts tt|dS)z This method is called from the alloy_config.py file to register an alloy region. Args: region_metadata: dict N)_IS_ALLOY_REGION_COEXIST_reset_region_info_add_alloy_regionsregion_metadatarrradd_region_schema_for_alloys r8cCs |t|<dSN_has_been_read_external_sources)sourcevaluerrrr0sr0cCst|Sr9r:)r<rrr_get_source_has_been_readsr>cCstdiaiaiagadS)NzResetting regions information)r!r"rr%REALMSrrrrrr4s  r4cCs^t|rZddt|D}|tt|t<|tt|t<|tt |t<t |tdS)NcSsi|]\}}||qSrr.0kvrrr z7_add_region_information_to_override..) _check_valid_schemar iteritemsREGION_IDENTIFIER_PROPERTY_NAMErREGION_KEY_PROPERTY_NAMEREALM_KEY_PROPERTY_NAMEr%$REALM_DOMAIN_COMPONENT_PROPERTY_NAMEr?rappendr6rrr#_add_region_information_to_overrides rNcCsNtd|t|tr.|D] }t|qnt|trBt|ntddS)NzAdding alloy regions from {}zQInvalid type for alloy regions. Please use a dictionary or a list of dictionaries)r!r"format isinstancelistrNdict TypeError)Z alloy_regionsr7rrrr5s    r5cCslttatr tdvr dandatrXtsXttD] }t|q6tt j dt |trhtrht |dS)N)true1TF) osgetenv%OCI_ALLOY_REGION_COEXIST_ENV_VAR_NAMEr3r_IS_ALLOY_MODEr4r;r0rrr5)Zalloy_regions_listr<rrr*_process_region_metadata_from_alloy_configs   rZcCsttjs tjtattjt |r.)FzFUnknown regionId '{}', default realm is defined, will fallback to '{}'a]You're using the {provider} Alloy configuration file, the region you're targeting is not declared in this config file. Please check if this is the correct region you're targeting or contact the {provider} cloud provider for help. If you want to target both OCI regions and {provider} regions, please set the OCI_ALLOY_REGION_COEXIST env var to True.)Zproviderz4Unknown regionId '{}', will assume it's in Realm OC1)r>rrrVenvirongetDEFAULT_REALM_ENV_VARNAMEsecond_level_domain_fallbackr0"_set_region_metadata_from_cfg_filer!r"rO!_set_region_metadata_from_env_var*_set_region_from_instance_metadata_servicerYr3ALLOY_PROVIDER_NAMErrrrrs0    rc CsPttjrdSttjtjt}tj|rLt dz6t |d}| }Wdn1sf0YWn:t tfy}zt d|WYd}~dSd}~00zddlm}Wntyt}Yn0zt|}Wn8|y}zt d|WYd}~dSd}~00d}|D] }t|r&t||r&d}q&|SdS) NFz Regions configuration file foundrz>Reading regions configuration file failed because of error: {}rJSONDecodeErrorzODecoding JSON array from regions configuration file failed because of error: {}T)r>rrr0rVpath expanduserREGIONS_CONFIG_FILE_PATHisfiler!r"openreadOSErrorIOErrorrO json.decoderrf ImportErrorr'jsonloadsrG!_add_region_information_to_lookup) rZexpanded_file_locationZregions_config_fileZregions_metadata_rawerfZregions_metadata_arrayZaddedr7rrrr`'s8     *    r`c CsttjrdSttjtjtrzddlm }Wnt yJt }Yn0zt tjt}Wn6|y}ztd|WYd}~dSd}~00t|rt||SdS)NFrrezCDecoding JSON from environment variable failed because of error: {})r>rrr0rVr\r] OCI_REGION_METADATA_ENV_VAR_NAMErorfrpr'rqrrr!r"rOrGrs)rrfr7rtrrrraOs       rac Cs`ttjrdSttjzZtdgddddd}t}|tt |d|j tdt d}|j }t d |Wn<tttfy}zt d |WYd}~dSd}~00|jd krt d t|j|j dSzdd lm}Wntyt}Yn0zt|}Wn8|yF}zt d|WYd}~dSd}~00t|r\t||SdS)NF)iiiiir)totalZstatus_forcelistrlZconnectstatus)Z max_retries) <)timeoutZheadersz%Region metadata blob from IMDS is: {}z0Failed to call IMDS service because of error: {}z1HTTP Get Failed: URL: {}, Status: {}, Message: {}rez4Decoding JSON from IMDS service because of error: {})r>rrr0rr ZSessionZmountGET_REGION_URLr r]METADATA_AUTH_HEADERStextr!r"rOr r r Z status_coderorfrpr'rqrrrGrs)rZretry_strategysZresponseZregion_metadata_rawrtrfr7rrrrbksD      rbcCsNtD]D}||vr&td|dS||dkrtd|dSqdS)Nz#Key {} not found in region metadataFrz,Value for key {} in region metadata is emptyT)REGION_METADATA_KEYSr!r"rO)r7keyrrrrGs rGcCsddt|D}|ttvr0|tt|t<|ttvrL|tt|t<|ttvrh|tt|t<|tt vrt |t||tks||tkrdSdS)NcSsi|]\}}||qSrr@rArrrrErFz5_add_region_information_to_lookup..TF) rrHrJrrIr%rKr?rLrrM)r7rrrrrss    rscCsb|tvrt|}d|vrR|r@d||}td||||St||||}|St|||SdS)Nr[z https://{}.{}zbConstruction endpoint from endpoint service name {} and region {} with '.' as domain. Endpoint: {})rrOr!r"r( _endpoint)r*rr,r-r+rrrr)s r)cCsD|r(|}|r|d|}|dt|St|tj|t|dSdS)N{region}z{secondLevelDomain})rZsecondLevelDomain)replace_second_level_domainr( DOMAIN_FORMATrO)r*rr,r+rrrrs  rcCsdttjs tjtattj|t vr6t |}n&trHtt d<d}ndt vrXt dd}t |S)Nunknownr$zFallback to default OCI region is blocked. This is likely happening if you are trying to access an alloy region not defined in the alloy region sources, and the env var OCI_ALLOY_REGION_COEXIST is not set to True.) r>rrrVr\r]r^r_r0r%keysr?r)rZrealmrrrrs     rcCsd}|tvr^|dur:|r*d|d}q\td|qj|d}|dkrj|d|d}n t|}|durtd|||j|d}|S) Nzhttps://z .{domain}zUnknown service {!r}rz{domain}zMUnable to format endpoint for service, {} , and service_endpoint_template, {})domain)rSERVICE_ENDPOINTSr'rOfind)r*rr,r-Z url_formatposr+rrrr(s    r()NNNN)T)N)NNN)N)NN)QZ __future__rrVrqZloggingenumrrrrZoci.exceptionsrZ oci._vendorrr Zoci._vendor.requests.exceptionsr r r Zoci._vendor.requests.adaptersr Zoci._vendor.urllib3.util.retryrrr%r?rrrrurKrLrJrIrZMETADATA_URL_BASErOr}r~rgjoinrirr^r_rrrrr;rYrXr3rcZ getLogger__name__r!rr r#r&r.r1r2r8r0r>r4rNr5rZrr`rarbrGrsr)rrr(rrrrs              1    !(0