B \0@sddlZddlZddlZddlmZddlmZddlmZm Z m Z ddl m Z e eZddZGd d d eZGd d d eZGd ddeZGdddeZGdddeZdS)N)get_service_module_name)WaiterDocstring) WaiterError ClientErrorWaiterConfigError) xform_namec Cs|||}t|j}tt||}dd}t||jj|jj|dd|_ t dt |jj|f}t |t fd|i}||||S)a :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|f|dS)N)Waiterwait)selfkwargsr 3/tmp/pip-build-uw_ogi45/botocore/botocore/waiter.pyr 4sz'create_waiter_with_client..waitF) waiter_nameZ event_emitter service_modelZservice_waiter_modelZinclude_signaturez %s.Waiter.%sr ) get_waiterr operationNormalizedOperationMethodgetattrrmetaeventsr__doc__strrtyper ) rZ waiter_modelclientsingle_waiter_configZoperation_nameoperation_methodr Zwaiter_class_nameZdocumented_waiter_clsr r rcreate_waiter_with_clients$      rc@seZdZddZddZdS)rcCs ||_dS)N)_client_method)r Z client_methodr r r__init__Osz"NormalizedOperationMethod.__init__c Ks6y |jf|Stk r0}z|jSd}~XYnXdS)N)rrresponse)r r er r r__call__Rs z"NormalizedOperationMethod.__call__N)__name__ __module__ __qualname__rr"r r r rrNsrc@s(eZdZdZddZddZddZdS) WaiterModelcCs@|d|_|dd}||||_tt|d|_dS)a 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. waitersversionunknownN)_waiter_configget_verify_supported_versionr)listsortedkeysZ waiter_names)r Z waiter_configr)r r rr\s    zWaiterModel.__init__cCs"||jkrtd|j|fddS)Nz^Unsupported waiter version, supported version must be: %s, but version of waiter config is: %s) error_msg)SUPPORTED_VERSIONr)r r)r r rr-ts  z%WaiterModel._verify_supported_versioncCs8y|j|}Wn tk r.td|YnXt|S)NzWaiter does not exist: %s)r+KeyError ValueErrorSingleWaiterConfig)r rrr r rr|s zWaiterModel.get_waiterN)r#r$r%r2rr-rr r r rr&Ysr&c@s$eZdZdZddZeddZdS)r5zRepresents 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). cCs6||_|dd|_|d|_|d|_|d|_dS)N descriptionrdelayZ maxAttempts)_configr,r6rr8 max_attempts)r rr r rrs   zSingleWaiterConfig.__init__cCs.g}x$|jdD]}t|}||qW|S)N acceptors)r9AcceptorConfigappend)r r;Zacceptor_configacceptorr r rr;s zSingleWaiterConfig.acceptorsN)r#r$r%rrpropertyr;r r r rr5s r5c@sDeZdZddZddZddZddZd d Zd d Zd dZ dS)r<cCs8|d|_|d|_|d|_|d|_||_dS)Nstatematcherexpectedargument)r@rArBr,rC_create_matcher_func matcher_func)r configr r rrs     zAcceptorConfig.__init__cCsn|jdkr|S|jdkr$|S|jdkr6|S|jdkrH|S|jdkrZ|Std|jddS)NpathZpathAllZpathAnystatuserrorzUnknown acceptor: %s)r1)rA_create_path_matcher_create_path_all_matcher_create_path_any_matcher_create_status_matcher_create_error_matcherr)r r r rrDs     z#AcceptorConfig._create_matcher_funccs$t|j|jfdd}|S)Ncsd|kr dS|kS)NError)search)r )rB expressionr racceptor_matchessz=AcceptorConfig._create_path_matcher..acceptor_matches)jmespathcompilerCrB)r rRr )rBrQrrJs z#AcceptorConfig._create_path_matchercs$t|j|jfdd}|S)NcsFd|kr dS|}t|tr$|s(dSx|D]}|kr.dSq.WdS)NrOFT)rP isinstancer.)r resultelement)rBrQr rrRs  zAAcceptorConfig._create_path_all_matcher..acceptor_matches)rSrTrCrB)r rRr )rBrQrrKs z'AcceptorConfig._create_path_all_matchercs$t|j|jfdd}|S)NcsFd|kr dS|}t|tr$|s(dSx|D]}|kr.dSq.WdS)NrOFT)rPrUr.)r rVrW)rBrQr rrRs  zAAcceptorConfig._create_path_any_matcher..acceptor_matches)rSrTrCrB)r rRr )rBrQrrLs z'AcceptorConfig._create_path_any_matchercs|jfdd}|S)Ncs|did}|kS)NZResponseMetadataZHTTPStatusCode)r,)r status_code)rBr rrRs z?AcceptorConfig._create_status_matcher..acceptor_matches)rB)r rRr )rBrrMs z%AcceptorConfig._create_status_matchercs|jfdd}|S)Ncs|diddkS)NrOZCoder7)r,)r )rBr rrRsz>AcceptorConfig._create_error_matcher..acceptor_matches)rB)r rRr )rBrrNs z$AcceptorConfig._create_error_matcherN) r#r$r%rrDrJrKrLrMrNr r r rr<s  r<c@seZdZddZddZdS)r cCs||_||_||_dS)a :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)_operation_methodnamerF)r rZrFrr r rr szWaiter.__init__c Kst|jj}d}|di}|d|jj}|d|jj}d}x|jf|}|d7}xB|D]} | |r\| j }Pq\Wd|krt |j |ddd |d |d krt d dS|d krt |j d|d ||krt |j d|d t|qBWdS)NZwaitingZ WaiterConfigZDelayZ MaxAttemptsrrrOMessageUnknown)rZreasonZ last_responsesuccessz3Waiting complete, waiter matched the success state.Zfailurez+Waiter encountered a terminal failure statezMax attempts exceeded)r.rFr;popr,r8r:rYrEr@rrZloggerdebugtimesleep) r r r;Z current_staterFZ sleep_amountr:Z num_attemptsr r>r r rr s@      z Waiter.waitN)r#r$r%rr r r r rr sr )rSloggingrbZbotocore.utilsrZbotocore.docs.docstringr exceptionsrrrr7r getLoggerr#r`robjectrr&r5r<r r r r r s    4 +k