U
    Y¨+d#  ã                   @   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   ú8/tmp/pip-unpacked-wheel-rdvd7wfc/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ÚidZ
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   rE   x   s    zChannel.basic_ackc                 C   s   |   |¡ ¡ d S )z)Return the number of messages in a queue.Zmessage_count)r0   Z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   rD   )r   r   r/   ÚnÚresultsr@   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   rD   ’   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ÚenvironrC   Zvirtual_hostZuseridÚpasswordÚhostnameÚportÚboolÚtransport_optionsÚformatr
   Zauthenticate)	r   rR   ÚaccountÚuserZapi_keyÚhostrW   rK   rP   r   r   r   r   –   s*    
 
ÿÿ
 þzChannel.slmqc                 C   s   | j jS r!   )Ú
connectionÚclient©r   r   r   r   rR   «   s    zChannel.conninfoc                 C   s
   | j jjS r!   )r^   r_   rY   r`   r   r   r   rY   ¯   s    zChannel.transport_optionsc                 C   s   | j  d¡p| jS )Nr,   )rY   rC   Údefault_visibility_timeoutr`   r   r   r   r,   ³   s    ÿzChannel.visibility_timeoutc                 C   s   | j  dd¡S )Nr-   rO   )rY   rC   r`   r   r   r   r-   ¸   s    zChannel.queue_name_prefix)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ra   Zdomain_formatrQ   r   Úsetr"   r   r$   r&   ÚCHARS_REPLACE_TABLEr+   r0   r4   r7   rB   rE   rF   rJ   rD   Úpropertyr   rR   rY   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)rb   rc   rd   re   r   Zpolling_intervalÚdefault_portr	   rj   Zconnection_errorsr   ÚsocketÚerrorr   r   r   r   rj   ½   s    ÿÿrj   )re   rS   rl   Ústringr   r   Zkombu.utils.encodingr   r   Zkombu.utils.jsonr   r   Zkombu.utils.objectsr   rO   r	   Zsoftlayer_messagingr
   Zsoftlayer_messaging.errorsr   r   Úpunctuationrg   r   rj   r   r   r   r   Ú<module>   s&   ÿ 