o
    !dN&                     @   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   Ausr/lib/python3.10/site-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sessionZ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)Z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)Z
subcommand
ValueError)r"   Z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_cmdsZ_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_tableZevent_handler_class)r   _sessionr*   r+   WaiterCommandDocHandler)r"   r   r   r   create_help_commandO   s
   zWaitCommand.create_help_command)
__name__
__module____qualname__NAMEDESCRIPTIONr!   r'   r(   r.   __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   )r,   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 )zThis 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 )Nr5   r   )nameparent_nameZoperation_callerr   operation_model)r   
get_waiterr   	operationr   r;   WaiterStateCommandWaiterCallerr,   WaiterStateDocBuilderbuild_waiter_state_descriptionr3   )	r"   r7   waiter_configr8   operation_namer;   Zwaiter_state_commandZwaiter_state_doc_builderdescriptionr   r   r   r6   h   s   

	z1WaiterStateCommandBuilder._build_waiter_state_cmdN)r/   r0   r1   r!   r)   r6   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 )r@   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"   rB   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)
rJ   rD   Z	acceptorsstate_build_success_description_build_operation_descriptionr=   _build_polling_descriptiondelaymax_attempts)r"   rD   acceptorr   r   r   rA      s   
z4WaiterStateDocBuilder.build_waiter_state_descriptionc                 C   s<   |j }| j| }d }|dv rd|j }|| }||j }|S )N)rF   rH   rG   zJMESPath query %s returns )matcherSUCCESS_DESCRIPTIONSZargumentexpected)r"   rR   rS   Zsuccess_descriptionZresource_descriptionZfull_success_descriptionr   r   r   rM      s   

z0WaiterStateDocBuilder._build_success_descriptionc                 C   s   t |dd}d| S )N_r5   zwhen polling with ``%s``.)r   replace)r"   r=   rC   r   r   r   rN      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"   rP   rQ   rD   r   r   r   rO      s
   z0WaiterStateDocBuilder._build_polling_descriptionN)	r/   r0   r1   rT   r!   rA   rM   rN   rO   r   r   r   r   r@      s    r@   c                   @   s   e Zd Zdd Zdd ZdS )r?   c                 C   s   || _ || _d S r   )r,   _waiter_name)r"   r   r7   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)Zregion_nameendpoint_urlZverifyr   r   )	r,   Zcreate_clientZregionrY   Z
verify_sslr<   r   rX   r   )r"   r   rC   
parametersr&   Zclientwaiterr   r   r   invoke   s   zWaiterCaller.invokeN)r/   r0   r1   r!   r\   r   r   r   r   r?      s    r?   c                       s    e Zd ZdZ fddZ  ZS )r>    c                    s$   t t|  }| j| j_d | j_|S r   )r    r>   r.   r3   Z_operation_modeldocumentationZoutput_shape)r"   help_commandr#   r   r   r.      s   
z&WaiterStateCommand.create_help_command)r/   r0   r1   r3   r.   r4   r   r   r#   r   r>      s    r>   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 )r-   c                 K      d S r   r   r"   r_   r   r   r   r   doc_synopsis_start      z*WaiterCommandDocHandler.doc_synopsis_startc                 K   r`   r   r   r"   Zarg_namer_   r   r   r   r   doc_synopsis_option   rc   z+WaiterCommandDocHandler.doc_synopsis_optionc                 K   r`   r   r   ra   r   r   r   doc_synopsis_end   rc   z(WaiterCommandDocHandler.doc_synopsis_endc                 K   r`   r   r   ra   r   r   r   doc_options_start   rc   z)WaiterCommandDocHandler.doc_options_startc                 K   r`   r   r   ra   r   r   r   doc_options_end   rc   z'WaiterCommandDocHandler.doc_options_endc                 K   r`   r   r   rd   r   r   r   
doc_option   rc   z"WaiterCommandDocHandler.doc_optionN)	r/   r0   r1   rb   re   rf   rg   rh   ri   r   r   r   r   r-      s    r-   N)Zbotocorer   Zbotocore.exceptionsr   Zawscli.clidriverr   Zawscli.customizations.commandsr   r   r   r   r	   r   r   objectr   r@   r?   r>   r-   r   r   r   r   <module>   s   	"1>