o
    .&ßaN&  ã                   @   s´   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„ Z
dd„ Zd	d
„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ de	ƒZdS )é    )Ú
xform_name)ÚDataNotFoundError)ÚServiceOperation)ÚBasicCommandÚ	BasicHelpÚBasicDocHandlerc                 C   s   |   dt¡ d S )Nzbuilding-command-table)ÚregisterÚadd_waiters)Úcli© r   ú?/usr/lib/python3/dist-packages/awscli/customizations/waiters.pyÚregister_add_waiters   s   r   c                 K   sP   t |dd ƒ}|d ur$t||ƒ}|d u rd S |j}|r&t|||ƒ| d< d S d S d S )NÚservice_modelÚwait)ÚgetattrÚ#get_waiter_model_from_service_modelÚwaiter_namesÚWaitCommand)Úcommand_tableÚsessionÚcommand_objectÚkwargsr   Úwaiter_modelr   r   r   r   r	      s   ÿÿ÷r	   c                 C   s,   z|   |j|j¡}W |S  ty   Y d S w ©N)Úget_waiter_modelÚservice_nameÚapi_versionr   )r   r   Úmodelr   r   r   r   +   s   ÿþÿr   c                       s@   e Zd ZdZdZ‡ fdd„Zdd„ Z‡ fdd„Zd	d
„ Z‡  Z	S )r   r   zqWait until a particular condition is satisfied. Each subcommand polls an API until the listed requirement is met.c                    s4   || _ || _t|| j | jd�| _tt| ƒ |¡ d S )N)r   r   r   )Ú_modelÚ_service_modelÚWaiterStateCommandBuilderÚwaiter_cmd_builderÚsuperr   Ú__init__)Úselfr   r   r   ©Ú	__class__r   r   r#   :   s   ýzWaitCommand.__init__c                 C   s   |j d u r	tdƒ‚d S )NzVusage: aws [options] <command> <subcommand> [parameters]
aws: error: too few arguments)Ú
subcommandÚ
ValueError)r$   Úparsed_argsÚparsed_globalsr   r   r   Ú	_run_mainD   s   
ÿzWaitCommand._run_mainc                    s(   t t| ƒ ¡ }| j |¡ |  |¡ |S r   )r"   r   Ú_build_subcommand_tabler!   Úbuild_all_waiter_state_cmdsÚ_add_lineage)r$   Úsubcommand_tabler%   r   r   r,   I   s   
z#WaitCommand._build_subcommand_tablec                 C   s   t | j| | j| jtd�S )N)r   Ú	arg_tableÚevent_handler_class)r   Ú_sessionr/   r0   ÚWaiterCommandDocHandler)r$   r   r   r   Úcreate_help_commandO   s
   ýzWaitCommand.create_help_command)
Ú__name__Ú
__module__Ú__qualname__ÚNAMEÚDESCRIPTIONr#   r+   r,   r4   Ú__classcell__r   r   r%   r   r   4   s    
r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )r    c                 C   s   || _ || _|| _d S r   )r2   r   r   )r$   r   r   r   r   r   r   r#   W   s   
z"WaiterStateCommandBuilder.__init__c                 C   s.   | j j}|D ]}t|dƒ}|  |¡||< qdS )zºThis adds waiter state commands to the subcommand table passed in.

        This is the method that adds waiter state commands like
        ``instance-running`` to ``ec2 wait``.
        ú-N)r   r   r   Ú_build_waiter_state_cmd)r$   r/   r   Úwaiter_nameÚwaiter_cli_namer   r   r   r-   \   s   
ÿþz5WaiterStateCommandBuilder.build_all_waiter_state_cmdsc           	      C   s^   | j  |¡}t|dƒ}|j}| j |¡}t|dt| j|ƒ| j|d�}t	|ƒ}| 
¡ }||_|S )Nr;   r   )ÚnameÚparent_nameÚoperation_callerr   Úoperation_model)r   Ú
get_waiterr   Ú	operationr   rB   ÚWaiterStateCommandÚWaiterCallerr2   ÚWaiterStateDocBuilderÚbuild_waiter_state_descriptionr9   )	r$   r=   Úwaiter_configr>   Úoperation_namerB   Úwaiter_state_commandÚwaiter_state_doc_builderÚdescriptionr   r   r   r<   h   s   

ü	z1WaiterStateCommandBuilder._build_waiter_state_cmdN)r5   r6   r7   r#   r-   r<   r   r   r   r   r    V   s    r    c                   @   sD   e Zd ZddddddœZdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ ZdS )rG   z%s is thrown z%s z%s for all elements z%s for any element z%s response is received )ÚerrorÚpathÚpathAllÚpathAnyÚstatusc                 C   s
   || _ d S r   )Ú_waiter_config)r$   rI   r   r   r   r#   �   s   
zWaiterStateDocBuilder.__init__c                 C   sh   | j j}|s&d}| j jD ]}|jdkr||  |¡7 } nq||  | j j¡7 }||  | j j| j j	¡7 }|S )NzWait until Úsuccess)
rS   rM   Ú	acceptorsÚstateÚ_build_success_descriptionÚ_build_operation_descriptionrD   Ú_build_polling_descriptionÚdelayÚmax_attempts)r$   rM   Úacceptorr   r   r   rH   “   s   
þÿÿz4WaiterStateDocBuilder.build_waiter_state_descriptionc                 C   s<   |j }| j| }d }|dv rd|j }|| }||j }|S )N)rO   rQ   rP   zJMESPath query %s returns )ÚmatcherÚSUCCESS_DESCRIPTIONSÚargumentÚexpected)r$   r\   r]   Úsuccess_descriptionÚresource_descriptionÚfull_success_descriptionr   r   r   rW   ¨   s   
ÿ
z0WaiterStateDocBuilder._build_success_descriptionc                 C   s   t |ƒ dd¡}d| S )NÚ_r;   zwhen polling with ``%s``.)r   Úreplace)r$   rD   rJ   r   r   r   rX   ¸   s   z2WaiterStateDocBuilder._build_operation_descriptionc                 C   s   d||f }|S )NzŠ It will poll every %s seconds until a successful state has been reached. This will exit with a return code of 255 after %s failed checks.r   )r$   rZ   r[   rM   r   r   r   rY   ¼   s
   ýÿz0WaiterStateDocBuilder._build_polling_descriptionN)	r5   r6   r7   r^   r#   rH   rW   rX   rY   r   r   r   r   rG   ‡   s    ûrG   c                   @   s   e Zd Zdd„ Zdd„ ZdS )rF   c                 C   s   || _ || _d S r   )r2   Ú_waiter_name)r$   r   r=   r   r   r   r#   Æ   s   
zWaiterCaller.__init__c                 C   s>   | j j||j|j|jd�}| t| jƒ¡}|jdi |¤Ž dS )N)Úregion_nameÚendpoint_urlÚverifyr   r   )	r2   Úcreate_clientÚregionrh   Ú
verify_sslrC   r   rf   r   )r$   r   rJ   Ú
parametersr*   ÚclientÚwaiterr   r   r   ÚinvokeÊ   s   ýzWaiterCaller.invokeN)r5   r6   r7   r#   rp   r   r   r   r   rF   Å   s    rF   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )rE   Ú c                    s$   t t| ƒ ¡ }| j| j_d | j_|S r   )r"   rE   r4   r9   Ú_operation_modelÚdocumentationÚoutput_shape)r$   Úhelp_commandr%   r   r   r4   ×   s   
z&WaiterStateCommand.create_help_command)r5   r6   r7   r9   r4   r:   r   r   r%   r   rE   Ô   s    rE   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )r3   c                 K   ó   d S r   r   ©r$   ru   r   r   r   r   Údoc_synopsis_startâ   ó   z*WaiterCommandDocHandler.doc_synopsis_startc                 K   rv   r   r   ©r$   Úarg_nameru   r   r   r   r   Údoc_synopsis_optionå   ry   z+WaiterCommandDocHandler.doc_synopsis_optionc                 K   rv   r   r   rw   r   r   r   Údoc_synopsis_endè   ry   z(WaiterCommandDocHandler.doc_synopsis_endc                 K   rv   r   r   rw   r   r   r   Údoc_options_startë   ry   z)WaiterCommandDocHandler.doc_options_startc                 K   rv   r   r   rw   r   r   r   Údoc_options_endî   ry   z'WaiterCommandDocHandler.doc_options_endc                 K   rv   r   r   rz   r   r   r   Ú
doc_optionñ   ry   z"WaiterCommandDocHandler.doc_optionN)	r5   r6   r7   rx   r|   r}   r~   r   r€   r   r   r   r   r3   á   s    r3   N)Úbotocorer   Úbotocore.exceptionsr   Úawscli.clidriverr   Úawscli.customizations.commandsr   r   r   r   r	   r   r   Úobjectr    rG   rF   rE   r3   r   r   r   r   Ú<module>   s   	"1>