a fU@sddlmZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZmZmZddlmZddlmZmZmZmZddlmZddlmZddlZdd lmZdd l m!Z!m"Z"m#Z#m$Z$dd l%m&Z&dd l'm(Z(m)Z)dd l*m+Z+ddl,m-Z-ddl.m/Z/m0Z0ddlm1Z1m2Z2ddl3m4Z4ddl5m6Z6m7Z7m8Z8e7dZ9dZ:dZ;ej<=e:Z>d?e4Z@e AdZBe AdZCdZDdZEej<=ddZFeGeFejHreFIdkrdZEddZJdCd!d"ZKd#d$ZLd%d&ZMd'd(ZNd)ZOd*ZPd+ZQd,ZRd-ZSd.ZTdd/d0d1d2d3ZUd4d5ZVd6d7ZWd8d9ZXGd:d;d;eZYGdd?d?ej]Z^eEr~e^ej_j`d@<GdAdBdBeaZbdS)D)absolute_importN)datedatetimetimezone) default_timer)requestssixurllib3 sseclient)parse)tz) HTTPResponse) constants exceptionsregionsretry)signers)get_config_value_or_defaultvalidate_config)Request)Response)CircuitBreakerStrategyNoCircuitBreakerStrategy)CircuitBreakerCircuitBreakerMonitor) __version__) NONE_SENTINELSentinelextract_service_endpointZMissingZOCI_SDK_APPEND_USER_AGENT4OCI_REALM_SPECIFIC_SERVICE_ENDPOINT_TEMPLATE_ENABLEDzOracle-PythonSDK/{}zdict\(str, (.+?)\)$zlist\[(.+?)\]$zOhttps://docs.oracle.com/en-us/iaas/Content/API/Concepts/sdk_troubleshooting.htmTZOCI_PYSDK_USING_EXPECT_HEADERfalseFcGsi}|D]}||q|SN)update)Z dictionariesZmergedZ dictionaryr$3/usr/lib/python3.9/site-packages/oci/base_client.pymerge_type_mappings8s r&cCs@dtttt|pd}|}tr<|dt7}|S)Nz{} (python {}; {}-{}) {}r'z {})format USER_INFOplatformZpython_versionmachinesystemstripAPPEND_USER_AGENT)ZextraZagentr$r$r%build_user_agent?sr/cCsdttdS)N z: )strrZutcnowr$r$r$r%utc_nowMsr2cCs"|rdtjjj_n dtjjj_dS)Nrr)r movesZ http_clientZHTTPConnection debuglevel)Z is_enabledr$r$r%is_http_log_enabledQsr5cCs:t|D]*\}}t|tjs(t|tr t|||<q |Sr")r iteritems isinstance integer_typesfloatr1)headersZ header_nameZ header_valuer$r$r%_sanitize_headers_for_requestsXsr;streambytesztext/event-streamapplication/jsong$@gN@, r0|)multiZcsvZtsvZssvZpipescCsd}|dkr|}qdS)N )readline)fpcurrentr$r$r%_read_all_headerszsrGcCsDg}|D],}t|tjr*||dq||qd|}|S)Nzutf-8rC)r7r text_typeappendencodejoin)Z input_bufferZ bytes_bufferchunkmsgr$r$r% _to_bytess   rNcCs2|dd}t|dko0|ddo0|ddkS)NrHTTP/rs100)splitlen startswith)linepartsr$r$r%_is_100_continues  rWc@seZdZddZddZdS)OCIHTTPResponsecOs(|d|_tj|g|Ri|dS)N status_tuple)pop _status_tupler__init__selfargskwargsr$r$r%r\s zOCIHTTPResponse.__init__cCs(|jdur|j}d|_|St|SdSr")r[r _read_status)r^rYr$r$r%ras  zOCIHTTPResponse._read_statusN)__name__ __module__ __qualname__r\rar$r$r$r%rXsrXcsReZdZdZfddZfddZdddZd d Zd d Zfd dZ Z S) OCIConnectionz+ HTTPConnection with 100 Continue support. csFtt|j|i||j|_d|_d|_td t t ||_ dS)NF{}.{}) superrer\response_class_original_response_cls_response_received_using_expect_headerlogging getLoggerr(rbidloggerr] __class__r$r%r\s zOCIConnection.__init__cs~d|_|dddkr0|jdkr(tdd|_n |jdkrBtdd|_|j|_tt|j ||||g|Ri|}d|_ |S) NFexpectr'z 100-continuerzUsing Expect header...TzNot using Expect header...) rjgetr4printrkrirhrgre _send_requestZ_expect_header_set)r^methodurlbodyr:r_r`Zrvalrpr$r%rus$   zOCIConnection._send_requestNcOs|jdt|j}|jdd=|js>t|tr>||7}d}|||jr~|jdkr`tdt j |j dr~| |dS|dur|jdkrtd||dS)N)ryrz.Waiting 3 seconds for 100-continue response...rPzBTimeout waiting for 100-continue response, sending message body...)_bufferextendrNrkr7r=sendr4rtr utilZ wait_for_readsock_handle_expect_response)r^ message_bodyr_r`rMr$r$r% _send_outputs$        zOCIConnection._send_outputcCs|jdd}z|}|dd}|jdkr6t|t|rd|jdkrPtdt|||nlt |dkr|d dr|jdkrtd|d dt |d |d df}t jt|d }||_d |_W|n |0dS) NrbrrOz7Received 100-continue response, sending message body...rPrQz4Received non-100-continue response, abort request...asciir)rYT)r~ZmakefilerDrRr4rtrWrG_send_message_bodyrSrTdecodeint functoolspartialrXrhrjclose)r^rrErUrVrYrhr$r$r%rs.      z%OCIConnection._handle_expect_responsecCs|dur||dSr")r|)r^rr$r$r%rsz OCIConnection._send_message_bodycs|jr dStt||Sr")rjrgrer|)r^r1rpr$r%r|szOCIConnection.send)N) rbrcrd__doc__r\rurrrr| __classcell__r$r$rpr%res   rec@seZdZeZdS)OCIConnectionPoolN)rbrcrdreZ ConnectionClsr$r$r$r%rsrhttpsc @seZdZeeejeee e dZ dZ ddZ ddZeddZejd dZd d Zd d ZeddZejddZeddZejddZddZdddddddddgf ddZddZddZddZd d!ZdOd"d#Zd$d%ZdPd'd(Zed)d*Z d+d,Z!dQd-d.Z"d/d0Z#d1d2Z$d3d4Z%d5d6Z&dRd7d8Z'dSd9d:Z(dTd;d<Z)dUd=d>Z*d?d@Z+dAdBZ,dCdDZ-dEdFZ.dGdHZ/edIdJZ0dKdLZ1dMdNZ2dS)V BaseClient)rr9r1boolrrobjectFc Kst||d||_||_|dd|_d|_|d|_|d|_|d|_|d|_ |d|_ |d |_ |jr|d r|d |_ n`d}d |vr|d r|d }nt |d r|j}|||j|j}tj||||d |j d |_ n"|d s td|d |_ ||_||_t|j||_t|_d|vrN|dnttf|_tt |d|_!t"#d$t%t&||_'|j'(t")t |drd|j'_*|j'+t"j,t-dnd|j'_*t-d|d|_.|d|_/d|_0|j/dust1|j/t2r|j'3dnzt1|j/t4s(t5d|j/j6durBt7t89n|j/j6|_0t:|j0}|durt;|j/j<|j/j=|j/j>|j0d}||j?|_?|j'3d$|jdS)N)signerregional_clientT base_pathservice_endpoint_template#service_endpoint_template_per_realmendpoint_service_nameallow_control_chars5client_level_realm_specific_endpoint_template_enabledZservice_endpointregionendpointrrrrz>An endpoint must be provided for a non-regional service clienttimeoutZadditional_user_agentrfZ log_requestsFskip_deserializationcircuit_breaker_strategyz$No circuit breaker strategy enabled!z!Invalid Circuit Breaker Strategy!)failure_thresholdrecovery_timeoutexpected_exceptionnamez Endpoint: {})@rrconfigrsr _endpoint _base_pathrrr_allow_control_chars6_client_level_realm_specific_endpoint_template_enabledrhasattrr handle_service_endpoint_templater endpoint_forrZ/MissingEndpointForNonRegionalServiceClientErrorservicecomplex_type_mappingsr&primitive_type_map type_mappingsrZSessionsessionDEFAULT_CONNECTION_TIMEOUTDEFAULT_READ_TIMEOUTrr/r user_agentrlrmr(rbrnroZ addHandlerZ NullHandlerZdisabledZsetLevelDEBUGr5rrcircuit_breaker_namer7rdebugr TypeErrorrr1uuiduuid4rrrrrrequest) r^rrrZ type_mappingr` region_to_useZendpoint_templatecircuit_breakerr$r$r%r\ s|                   $   zBaseClient.__init__cCs4|}|r0|tjvr0tj|}||vr0||S|Sr")should_allow_template_per_realmrZ REGION_REALMS)r^Z region_idrrZshould_enable_realm_templateZrealmr$r$r%rgs  z+BaseClient.handle_service_endpoint_templatecCs|jSr")rr^r$r$r%rrszBaseClient.endpointcCsR|jdkr||_n<|jrH||jsH|d|jsHd||j|_n||_dS)N/z{}/z{}{})rrendswithr()r^rr$r$r%rvs  $cCs t|jSr")rrrr$r$r% get_endpointszBaseClient.get_endpointcCs>|jr2|||j|j}tj|j|||jd|_nt ddS)N)rrrzeSetting the region is not allowed for non-regional service clients. You must instead set the endpoint) rrrrrrrrrr)r^rrr$r$r% set_regionszBaseClient.set_regioncCs|jSr"rrr$r$r%rszBaseClient.allow_control_charscCs ||_dSr"r)r^rr$r$r%rscCs|jSr")rrr$r$r%rsz@BaseClient.client_level_realm_specific_endpoint_template_enabledcCsx||_d}d|jvr,|jdr,|jd}nt|jdr@|jj}|||j|j}t j |j |||jd|j d|_ dS)Nrrr)rrrsrrrrrrrrrrr)r^rrrr$r$r%rs  cCs`t|jtjsTt|jtjsTt|jtjsTt|jtjsTt|jtjsTt|jtjrXdSdSdSNTF) r7rrZ%InstancePrincipalsSecurityTokenSignerZ"ResourcePrincipalsFederationSignerZ EphemeralResourcePrincipalSignerZ#EphemeralResourcePrincipalV21SignerZNestedResourcePrincipalsZ*OkeWorkloadIdentityResourcePrincipalSignerrr$r$r%2is_instance_principal_or_resource_principal_signers     z=BaseClient.is_instance_principal_or_resource_principal_signerNTc  Cs |rFtr|dvrryz'BaseClient.call_api..rrNZOCI_DB_OPC_HOST_SERIALzopc-host-serial{} content-typer>)rvrw query_params header_paramsrx response_typeenforce_content_headersrrOriztime elapsed for request: {}))enable_expect_headerrrZrssanitize_for_serializationr;r)rZHEADER_CLIENT_INFOrZHEADER_USER_AGENTHEADER_REQUEST_IDmissingbuild_request_idosenvironitemsr r3Zurllibr quoter1 to_path_valuereplaceprocess_query_paramsjsondumps!handle_service_params_in_endpointrrrr ServiceErrorstatusrZrefresh_security_tokentimerrorr()r^ resource_pathrv path_paramsrrrxrrroperation_nameapi_reference_linkrequired_argumentsZ/map_lowercase_header_params_keys_to_actual_keysZopc_host_serialrvZ replacementrrwrZ call_attemptsestartresponseendr$r$r%call_apisj            zBaseClient.call_apic Csi}ttdd|dddd}|D]}d}d|vrZd}|d} |d| }||vr||vsr||vr||vr||n||} |r| d7} | ||d<q| ||<q0|rd||d<q0d||<q0|S) Nr'.rrFz+DotTr)setfilterrKrrRfind) r^service_params_urlrrrservice_params_mapZservice_params service_paramZshould_append_dotZdot_idxvaluer$r$r%map_service_params_to_valuess$(    z'BaseClient.map_service_params_to_valuesc Csr|j}td}||dkrn|d}|||d}|||||}|D] \} } d| d} || | }qL|S)Nzhttps://rrr)rrSrfindrrr) r^rrrrZ start_idxZend_idxrrrrr$r$r%r6s   z,BaseClient.handle_service_params_in_endpointcCsJ|tur tS|tvr,td|tt|dkr8|St||SdS)Nz6Invalid collection format type {}. Valid types are: {}rB)rVALID_COLLECTION_FORMAT_TYPES ValueErrorr(listkeysrK)r^Z param_valueZcollection_format_typer$r$r% generate_collection_format_paramDsz+BaseClient.generate_collection_format_paramcCs||}i}|D]~\}}t|tr:|r0dnd||<qt|ts^t|ts^||||<qt|trr|||<q|D]\}}||d||<qzq|S)Ntruer!rf)rrr7rdictrrr()r^rZprocessed_query_paramsrrZ inner_keyZ inner_valr$r$r%rPs    zBaseClient.process_query_paramsc Cs"|jtdt|j|jfd}|jrVt|jj }|t j krV|j d ||j}|jsh|j}d}|jtkrzd}t|jddvrd}zt}|jj|j|j||j|j|j||jd} t} |jtjr|j td |jtjt| || r*t| d r*|j td t| jWntj j!y} zL| j"sPd | _"| j"d |jd |jd t#f| _"t !| WYd} ~ nrd} ~ 0tj j$y} zL| j"sd | _"| j"d |jd |jd t#f| _"t $| WYd} ~ n d} ~ 00|j} |j tdt| j%d| j%kr| r| tkr| j8dd9tkr| j/}n| r|=| j/| |}nd}t?| j%| j8||}|j td|S)NzRequest: %s %szCircuit Breaker State is {}!FTZacceptempty)authparamsr:datar<rztime elapsed for request {}: {}elapsedztime elapsed in response: )r'zRequest Endpoint: r0zd See {} for help troubleshooting this error, or contact support and provide this full error message.zResponse status: %si+iZRequestEntityTooLargez?Recieved a 413/RequestEntityTooLarge from {}, resetting sessionz+Circuit Breaker state changed from {} to {}rz.Received SSE response, returning an SSE clientzResponse returned)@roinfor2r1rvrwrrrsstatecircuitbreakerZ STATE_CLOSEDrr(rrZwithout_content_headersrSTREAM_RESPONSE_TYPESSE_RESPONSE_HEADER_VALUErrrrrrxrrrrrrrZConnectTimeoutr_TROUBLESHOOT_URLZRequestException status_coderr)rZnowrutc isoformat)get_deserialized_service_code_and_messageZwarningcontentrcopyr7rrZis_transient_errorraise_transient_service_errorraise_service_errorr:rr Z SSEClient%APPLICATION_JSON_CONTENT_HEADER_VALUEdeserialize_response_dataBYTES_RESPONSE_TYPEr)r^rrrrZinitial_circuit_breaker_staterr<rrrrrtarget_servicerequest_endpointclient_version timestamp service_codemessagedeserialized_data_Z new_sessionZnew_circuit_breaker_stateZrespr$r$r%rs"    * ((        ( zBaseClient.requestcCsttddS)N-r')r1rrrupperrr$r$r%rszBaseClient.build_request_idcCs(d|vr$dddt|D|d<dS)Nzopc-retry-tokenr'css$|]}ttjtjVqdSr")randomZ SystemRandomchoicestring ascii_lettersdigits)rrr$r$r% ryz;BaseClient.add_opc_retry_token_if_needed..)rKrange)r^rZretry_token_lengthr$r$r%add_opc_retry_token_if_neededsz(BaseClient.add_opc_retry_token_if_neededcCsd|vrd|d<dS)Nzopc-client-retriesrr$)rr$r$r%add_opc_client_retries_headersz(BaseClient.add_opc_client_retries_headercCs"t|tkrd|St|SdS)z Takes value and turn it into a string suitable for inclusion in the path, by url-encoding. :param obj: object or string value. :return string: quoted value. r?N)typerrKr1r^objr$r$r%rs  zBaseClient.to_path_valuec stjtjtttdf}tjtttjfttjfd}rsdrdtt sd ndrtt stt s nXj vrtt stj s n$|vrt|s t|rSturdStt stt r4fddDSttrljsTtjtjddSttrStt r}d}rfd d |D}nZtd std ttjfd d jD}fdd t jD}i}t |D]X\} } d} | } |rN|| d} || d} r`d| n| } !| | | || <q |SdS)a Builds a JSON POST object. If obj is str, int, float, bool, None, return directly. If obj is datetime.datetime, datetime.date convert to string in iso8601 format. If obj is list, sanitize each element in the list. If obj is dict, return the dict. If obj is swagger model, return the properties dict. :param obj: The data to serialize. :return: The serialized form of data. N)r1rrr9dict(list[cs4g|],}|rndr*dndqS)Nz[*])r(extract_list_item_type_from_swagger_type)rZsub_obj) declared_type field_namer^r$r% 5s z9BaseClient.sanitize_for_serialization..z+00:00Zcsi|]}||fqSr$r$r)dict_value_typer$r%rIryz9BaseClient.sanitize_for_serialization.. swagger_typesz7Not able to serialize data: {} of type: {} in field: {}cs0i|](\}}t|durj|t|qSr")getattr attribute_map)rattrrr,r$r%rOscs i|]\}}j|||fqSr$)r7)rr8 swagger_typer9r$r%rSryrrrf)"r string_typesr8r9rr*is_none_or_none_sentinelrTr7r"raise_type_error_serializing_modelrtuplerrrtzinfopytzr ZlocalizeZ astimezoner rr)extract_dict_value_type_from_swagger_typerrr(r1rbr5rr6r) r^r,r0r1typesZ0declared_swagger_type_to_acceptable_python_typesZobj_dictZkeys_to_types_and_field_nameZsanitized_dictkeyvalZvalue_declared_typeZinner_field_namer$)r0r4r1r,r^r%r sh             z%BaseClient.sanitize_for_serializationcCs|dup|tuSr")rr+r$r$r%r<bsz#BaseClient.is_none_or_none_sentinelcCs"td|t||t|jdS)NzGField {} with value {} was expected to be of type {} but was of type {})rr(r1r*rb)r^r1r,r0r$r$r%r=esz-BaseClient.raise_type_error_serializing_modelcCs t|}d}|r|d}|SNr)DICT_VALUE_TYPE_REGEXsearchgroupr^r:mresultr$r$r%rAhs   z4BaseClient.extract_dict_value_type_from_swagger_typecCs t|}d}|r|d}|SrE)LIST_ITEM_TYPE_REGEXrGrHrIr$r$r%r/qs   z3BaseClient.extract_list_item_type_from_swagger_typec Cs*tj|j||j||||||| | | d dSN)Zoriginal_requestrrrrrrr)rrr r: r^rrrrrrrrrrrr$r$r%rzszBaseClient.raise_service_errorc Cs*tj|j||j||||||| | | d dSrM)rZTransientServiceErrorr r:rNr$r$r%rsz(BaseClient.raise_transient_service_errorcCsF||jd|}d}d}t|tr8|d}|d}n|}|||fS)Nrcoder)rrr7rrs)r^rrrrrr$r$r%rs   z4BaseClient.get_deserialized_service_code_and_messagec Cs|d}z8||}tj|| d}|dks.r-zdict\(([^,]*), (.*)\)rOcsi|]\}}||qSr$rV)rrrrWr$r%rsz,BaseClient.__deserialize.. get_subtype)rTrematchrHrr"_BaseClient__deserialize_primitiverrXrr9r urrr_BaseClient__deserialize_dater!_BaseClient__deserialize_datetime_BaseClient__deserialize_model)r^rclsr$rWr%Z __deserializes6               zBaseClient.__deserializecCsBz ||}Wn0ty(t|}Ynty<|}Yn0|S)z Deserializes string to primitive type. :param data: str. :param cls: class literal. :return: int, float, str, bool. )UnicodeEncodeErrorr r\r)r^rr`rr$r$r%Z__deserialize_primitives     z"BaseClient.__deserialize_primitivecCsHzt|WSty$|YStyBtd|Yn0dS)zb Deserializes string to date. :param string: str. :return: date. z(Failed to parse `{0}` into a date objectN)r r ImportErrorr Exceptionr()r^r#r$r$r%Z__deserialize_dates   zBaseClient.__deserialize_datec Csz"t|d}|jtd}|WSty|zt|WYStyX|YYStyvtd |Yn0Ynty|YS0dS)z Deserializes string to datetime. The string should be in iso8601 datetime format. :param string: str. :return: datetime. z%Y-%m-%dT%H:%M:%S.%fZ)r?z,Failed to parse `{0}` into a datetime objectN) rstrptimerr Ztzutcrr rbrcr()r^r#Z naivedatetimeZ awaredatetimer$r$r%Z__deserialize_datetimes       z!BaseClient.__deserialize_datetimecCsL|}|jD]6\}}|j|}||vr||}t|||||q|S)z Deserializes list or dict to model. :param data: dict, list. :param cls: class literal. :return: model object. )r5rr7setattrrT)r^rr`instancer8Z attr_typepropertyrr$r$r%Z__deserialize_model7s zBaseClient.__deserialize_modelcCs(d}|r|}n|r|}n tjr$tj}|S)a  Gets the preferred Retry Strategy for the client :param operation_retry_strategy: (optional) Operation level Retry Strategy :param client_retry_strategy: (optional) Client level Retry Strategy :return: Preferred Retry Strategy. N)rZGLOBAL_RETRY_STRATEGY)Zoperation_retry_strategyZclient_retry_strategyZretry_strategyr$r$r%get_preferred_retry_strategyIsz'BaseClient.get_preferred_retry_strategycCs8|}|j}tj}|dur|S|dur(|S|dur4dSdSr)rrALLOW_CONTROL_CHARACTERS)r^rZrequest_configurationclient_configurationZglobal_configurationr$r$r%rRZsz%BaseClient.should_allow_control_charscCs6|j}tjt}|dur|S|dur2|dkSdS)z Returns a boolean of whether or not we should use realm specific endpoint templates The highest precedence goes in decending order. The order: Client / Environment / Default (False) NrF)rrrrsr r)r^rjZenv_configurationr$r$r%rms  z*BaseClient.should_allow_template_per_realm)NNN)r )NN)NNNNNNN)NNNNNNN)N)N)3rbrcrdrr9r r\rrrrrrir\rrgrsetterrrrrrrrrrrrrr( staticmethodr)rrr<r=rAr/rrrrrTr[r]r^r_rhrRrr$r$r$r%rs Z         e > b   X     *, r)r')cZ __future__rrrlr*rr@r!rrYr#rrZ _strptimerrrZtimeitrrZ_vendorrr r r Zdateutil.parserr Zdateutilr rZsix.moves.http_clientrr'rrrrrrrrrrrrrrrrrrversionrr}rrrrZAPPEND_USER_AGENT_ENV_VAR_NAMEr rrsr.r(r)compilerFrLr rZexpect_header_env_varr7r;rr&r/r2r5r;rrr rrrrrGrNrWrXZ connectionZVerifiedHTTPSConnectionreZHTTPSConnectionPoolrZ poolmanagerZpool_classes_by_schemerrr$r$r$r%s                  T