ó ÈuÚ_c@súddlZddlZddlZddlmZddlmZddlmZm Z m Z ddl m Z ej eƒZd„Zdefd „ƒYZd efd „ƒYZd efd „ƒYZdefd„ƒYZdefd„ƒYZdS(iÿÿÿÿN(tget_service_module_name(tWaiterDocstringi(t WaiterErrort ClientErrortWaiterConfigError(t xform_namec CsÀ|j|ƒ}t|jƒ}tt||ƒƒ}d„}td|d|jjd|jjd|dt ƒ|_ t dt |jjƒ|fƒ}t |tfi|d6ƒ}||||ƒS( s :type waiter_name: str :param waiter_name: The name of the waiter. The name should match the name (including the casing) of the key name in the waiter model file (typically this is CamelCasing). :type waiter_model: botocore.waiter.WaiterModel :param waiter_model: The model for the waiter configuration. :type client: botocore.client.BaseClient :param client: The botocore client associated with the service. :rtype: botocore.waiter.Waiter :return: The waiter object. c[stj||dS(N(tWaitertwait(tselftkwargs((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR4st waiter_namet event_emittert service_modeltservice_waiter_modeltinclude_signatures %s.Waiter.%sR(t get_waiterRt operationtNormalizedOperationMethodtgetattrRtmetateventsR tFalset__doc__tstrRttypeR( R t waiter_modeltclienttsingle_waiter_configtoperation_nametoperation_methodRtwaiter_class_nametdocumented_waiter_cls((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pytcreate_waiter_with_clients$     RcBseZd„Zd„ZRS(cCs ||_dS(N(t_client_method(Rt client_method((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyt__init__OscKs/y|j|SWntk r*}|jSXdS(N(R!Rtresponse(RR te((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyt__call__Rs(t__name__t __module__R#R&(((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyRNs t WaiterModelcBs)eZdZd„Zd„Zd„ZRS(icCsX|d|_|jddƒ}|j|ƒ||_tt|djƒƒƒ|_dS(sÙ Note that the WaiterModel takes ownership of the waiter_config. It may or may not mutate the waiter_config. If this is a concern, it is best to make a copy of the waiter config before passing it to the WaiterModel. :type waiter_config: dict :param waiter_config: The loaded waiter config from the *.waiters.json file. This can be obtained from a botocore Loader object as well. twaiterstversiontunknownN(t_waiter_configtgett_verify_supported_versionR+tlisttsortedtkeyst waiter_names(Rt waiter_configR+((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR#\s    cCs2||jkr.tdd|j|fƒ‚ndS(Nt error_msgs^Unsupported waiter version, supported version must be: %s, but version of waiter config is: %s(tSUPPORTED_VERSIONR(RR+((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR/ts cCs?y|j|}Wn!tk r4td|ƒ‚nXt|ƒS(NsWaiter does not exist: %s(R-tKeyErrort ValueErrortSingleWaiterConfig(RR R((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR|s  (R'R(R6R#R/R(((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR)Ys  R9cBs&eZdZd„Zed„ƒZRS(s¼Represents the waiter configuration for a single waiter. A single waiter is considered the configuration for a single value associated with a named waiter (i.e TableExists). cCsI||_|jddƒ|_|d|_|d|_|d|_dS(Nt descriptiontRtdelayt maxAttempts(t_configR.R:RR<t max_attempts(RR((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR#‹s    cCs;g}x.|jdD]}t|ƒ}|j|ƒqW|S(Nt acceptors(R>tAcceptorConfigtappend(RR@tacceptor_configtacceptor((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR@•s  (R'R(RR#tpropertyR@(((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR9„s RAcBsVeZd„Zed„ƒZd„Zd„Zd„Zd„Zd„Z d„Z RS(cCsL|d|_|d|_|d|_|jdƒ|_|jƒ|_dS(Ntstatetmatchertexpectedtargument(RFRGRHR.RIt_create_matcher_funct matcher_func(Rtconfig((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR#Ÿs    cCs¬|jdkr#d|j|jfS|jdkrFd|j|jfS|jdkrid|j|jfS|jdkrƒd|jS|jd krd |jSd |jSdS( Ntpaths2For expression "%s" we matched expected path: "%s"tpathAlls;For expression "%s" all members matched excepted path: "%s"tpathAnys@For expression "%s" we matched expected path: "%s" at least oncetstatuss%Matched expected HTTP status code: %sterrors'Matched expected service error code: %ss,No explanation for unknown waiter type: "%s"(RGRIRH(R((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyt explanation¦s  cCs—|jdkr|jƒS|jdkr2|jƒS|jdkrK|jƒS|jdkrd|jƒS|jdkr}|jƒStdd|jƒ‚dS(NRMRNRORPRQR5sUnknown acceptor: %s(RGt_create_path_matchert_create_path_all_matchert_create_path_any_matchert_create_status_matchert_create_error_matcherR(R((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyRJµs      cs1tj|jƒ‰|j‰‡‡fd†}|S(Ncs#d|krdSˆj|ƒˆkS(NtError(tsearch(R$(RHt expression(s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pytacceptor_matchesÐs (tjmespathtcompileRIRH(RR[((RHRZs:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyRSÌs cs1tj|jƒ‰|j‰‡‡fd†}|S(Ncs_d|krdSˆj|ƒ}t|tƒ s6| r:tSx|D]}|ˆkrAtSqAWtS(NRX(RYt isinstanceR0RtTrue(R$tresulttelement(RHRZ(s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR[Ús   (R\R]RIRH(RR[((RHRZs:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyRTÖs cs1tj|jƒ‰|j‰‡‡fd†}|S(Ncs_d|krdSˆj|ƒ}t|tƒ s6| r:tSx|D]}|ˆkrAtSqAWtS(NRX(RYR^R0RR_(R$R`Ra(RHRZ(s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR[îs   (R\R]RIRH(RR[((RHRZs:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyRUês cs|j‰‡fd†}|S(Ncs%|jdiƒjdƒ}|ˆkS(NtResponseMetadatatHTTPStatusCode(R.(R$t status_code(RH(s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR[s (RH(RR[((RHs:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyRVþs cs|j‰‡fd†}|S(Ncs"|jdiƒjddƒˆkS(NRXtCodeR;(R.(R$(RH(s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR[ s(RH(RR[((RHs:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyRW s ( R'R(R#RERRRJRSRTRURVRW(((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyRAžs     RcBseZd„Zd„ZRS(cCs||_||_||_dS(sœ :type name: string :param name: The name of the waiter :type config: botocore.waiter.SingleWaiterConfig :param config: The configuration for the waiter. :type operation_method: callable :param operation_method: A callable that accepts **kwargs and returns a response. For example, this can be a method from a botocore client. N(t_operation_methodtnameRL(RRgRLR((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR#s  c KsÍt|jjƒ}d}|jdiƒ}|jd|jjƒ}|jd|jjƒ}d}d}x`trÈ|j |} |d7}x‡|D](} | j | ƒr| }| j }PqqWd| krt d|j d d | djd d ƒ| djd d ƒfd| ƒ‚n|dkr/tjdƒdS|dkrid| j} t d|j d | d| ƒ‚n||kr¸|dkrŠd} n d| j} t d|j d | d| ƒ‚ntj|ƒqiWdS(Ntwaitingt WaiterConfigtDelayt MaxAttemptsiiRXRgtreasonsAn error occurred (%s): %sRetUnknowntMessaget last_responsetsuccesss3Waiting complete, waiter matched the success state.tfailures/Waiter encountered a terminal failure state: %ssMax attempts exceededs4Max attempts exceeded. Previously accepted state: %s(R0RLR@tpopR.R<R?tNoneR_RfRKRFRRgtloggertdebugRRttimetsleep( RR R@t current_stateRLt sleep_amountR?tlast_matched_acceptort num_attemptsR$RDRl((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyR.sT                   (R'R(R#R(((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyRs (R\tloggingRvtbotocore.utilsRtbotocore.docs.docstringRt exceptionsRRRR;Rt getLoggerR'RtR tobjectRR)R9RAR(((s:/opt/awscli/lib/python2.7/site-packages/botocore/waiter.pyt s    4 +z