U
    Ôðcc#  ã                   @   sÒ   d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
mZ ddlmZ ddlmZ zdd	lmZ dd
lmZ W n ek
r˜   d ZZY nX dd„ ejD ƒZG dd„ dejƒZG dd„ dejƒZdS )a+  SoftLayer Message Queue transport module for kombu.

Features
========
* Type: Virtual
* Supports Direct: Yes
* Supports Topic: Yes
* Supports Fanout: No
* Supports Priority: No
* Supports TTL: No

Connection String
=================
 *Unreviewed*

Transport Options
=================
 *Unreviewed*
é    N)ÚEmpty)Úbytes_to_strÚsafe_str)ÚdumpsÚloads)Úcached_propertyé   )Úvirtual)Ú
get_client)ÚResponseErrorc                 C   s   i | ]}|d krt |ƒd“qS )Ú_é_   )Úord)Ú.0Úc© r   úN/var/www/html/project/venv/lib/python3.8/site-packages/kombu/transport/SLMQ.pyÚ
<dictcomp>'   s      r   c                       sÞ   e Zd ZdZdZdZdZi Zeƒ Z	‡ fdd„Z
‡ fdd„Z‡ fd	d
„Zefdd„Zdd„ Z‡ fdd„Zdd„ Zdd„ Z‡ fdd„Zdd„ Zdd„ Zdd„ Zedd„ ƒZedd „ ƒZed!d"„ ƒZed#d$„ ƒZed%d&„ ƒZ‡  ZS )'ÚChannelzSLMQ Channel.i  zkombu%(vhost)sNc                    s@   t d krtdƒ‚tƒ j||Ž | j ¡ }|D ]}|| j|< q,d S )Nz7SLMQ transport requires the softlayer_messaging library)r
   ÚImportErrorÚsuperÚ__init__ÚslmqÚqueuesÚ_queue_cache)ÚselfÚargsÚkwargsr   Úqueue©Ú	__class__r   r   r   5   s    ÿ
zChannel.__init__c                    s&   |r| j  |¡ tƒ j||f|ž|ŽS ©N)Ú_noack_queuesÚaddr   Úbasic_consume)r   r   Zno_ackr   r   r   r   r   r$   ?   s    ÿÿzChannel.basic_consumec                    s,   || j kr | j| }| j |¡ tƒ  |¡S r!   )Z
_consumersZ_tag_to_queuer"   Údiscardr   Úbasic_cancel)r   Zconsumer_tagr   r   r   r   r&   E   s    

zChannel.basic_cancelc                 C   s   t t|ƒƒ |¡S )z4Format AMQP queue name into a valid SLQS queue name.)Ústrr   Ú	translate)r   ÚnameÚtabler   r   r   Úentity_nameK   s    zChannel.entity_namec                 K   s|   |   | j| ¡}z| j| W S  tk
rv   z| jj|| jd W n tk
rV   Y nX | j |¡ }| j|< | Y S X dS )zEnsure a queue exists in SLQS.)Úvisibility_timeoutN)	r+   Úqueue_name_prefixr   ÚKeyErrorr   Zcreate_queuer,   r   r   )r   r   r   Úqr   r   r   Ú
_new_queueO   s     ÿ
zChannel._new_queuec                    s<   |   |¡}| j |d¡ | j |¡jdd tƒ  |¡ dS )zDelete queue by name.NT)Úforce)r+   r   Úpopr   r   Údeleter   Ú_delete)r   r   r   r   Z
queue_namer   r   r   r4   ]   s    
zChannel._deletec                 K   s   |   |¡}| t|ƒ¡ dS )zPut message onto queue.N)r0   Úpushr   )r   r   Úmessager   r/   r   r   r   Ú_putd   s    
zChannel._putc                 C   s‚   |   |¡}| d¡}|d rx|d d }tt|d ƒƒ}|| jkrV| |d ¡ ¡  n|d d  |d |jdœ¡ |S t	ƒ ‚d	S )
z/Try to retrieve a single message off ``queue``.r   Úitemsr   ÚbodyÚidÚ
propertiesÚdelivery_info)Úslmq_message_idÚslmq_queue_nameN)
r0   r2   r   r   r"   r6   r3   Úupdater)   r   )r   r   r/   ÚrsÚmÚpayloadr   r   r   Ú_geti   s    


 ÿzChannel._getc                    sP   | j  |¡j}z|d }W n tk
r.   Y nX |  ||d ¡ tƒ  |¡ d S )Nr>   r=   )ZqosÚgetr<   r.   Údelete_messager   Ú	basic_ack)r   Zdelivery_tagr<   r   r   r   r   rF   x   s    zChannel.basic_ackc                 C   s   |   |¡ ¡ d S )z)Return the number of messages in a queue.Zmessage_count)r0   Údetail)r   r   r   r   r   Ú_size‚   s    zChannel._sizec                 C   sV   |   |¡}d}| d¡}|d rR|d D ]}|  ||d ¡ |d7 }q(| d¡}q|S )z'Delete all current messages in a queue.r   é
   r8   r:   r   )r0   r2   rE   )r   r   r/   ÚnÚresultsrA   r   r   r   Ú_purge†   s    


zChannel._purgec                 C   s    | j  |  |¡¡}| |¡ ¡ S r!   )r   r   r+   r6   r3   )r   r   Z
message_idr/   r   r   r   rE   ’   s    zChannel.delete_messagec           	      C   sÄ   | j d kr¾| j}tj d|j¡}tj d|j¡}tj d|j¡}tj d|j¡}tj d|j	¡}t
tj d| j d¡¡pzdƒ}d	 |rŠd
nd||rœd|› nd¡}t||d| _ | j  ||¡ | j S )NZSLMQ_ACCOUNTZSL_USERNAMEZ
SL_API_KEYZ	SLMQ_HOSTZ	SLMQ_PORTZSLMQ_SECUREÚsecureTz	{}://{}{}ÚhttpsÚhttpú:Ú )Úendpoint)Ú_slmqÚconninfoÚosÚenvironrD   Zvirtual_hostZuseridÚpasswordÚhostnameÚportÚboolÚtransport_optionsÚformatr
   Zauthenticate)	r   rT   ÚaccountÚuserZapi_keyÚhostrY   rM   rR   r   r   r   r   –   s*    
 
ÿÿ
 þzChannel.slmqc                 C   s   | j jS r!   )Ú
connectionÚclient©r   r   r   r   rT   «   s    zChannel.conninfoc                 C   s
   | j jjS r!   )r`   ra   r[   rb   r   r   r   r[   ¯   s    zChannel.transport_optionsc                 C   s   | j  d¡p| jS )Nr,   )r[   rD   Údefault_visibility_timeoutrb   r   r   r   r,   ³   s    ÿzChannel.visibility_timeoutc                 C   s   | j  dd¡S )Nr-   rQ   )r[   rD   rb   r   r   r   r-   ¸   s    zChannel.queue_name_prefix)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rc   Zdomain_formatrS   r   Úsetr"   r   r$   r&   ÚCHARS_REPLACE_TABLEr+   r0   r4   r7   rC   rF   rH   rL   rE   Úpropertyr   rT   r[   r   r,   r-   Ú__classcell__r   r   r   r   r   ,   s8   





r   c                   @   s.   e Zd ZdZeZdZdZejj	e
ejf Z	dS )Ú	TransportzSLMQ Transport.r   N)rd   re   rf   rg   r   Zpolling_intervalÚdefault_portr	   rl   Zconnection_errorsr   ÚsocketÚerrorr   r   r   r   rl   ½   s    ÿÿrl   )rg   rU   rn   Ústringr   r   Zkombu.utils.encodingr   r   Zkombu.utils.jsonr   r   Zkombu.utils.objectsr   rQ   r	   Zsoftlayer_messagingr
   Zsoftlayer_messaging.errorsr   r   Úpunctuationri   r   rl   r   r   r   r   Ú<module>   s&   ÿ 