U
    Íø.eG  ã                   @  sÞ   d Z ddlm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*
é    )ÚannotationsN)Ú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-48hrr5dg/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   7   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%   A   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'   G   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_nameM   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_queueQ   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   r5   _   s    
zChannel._deletec                 K  s   |   |¡}| t|ƒ¡ dS )zPut message onto queue.N)r1   Úpushr   )r   r   Úmessager   r0   r   r   r   Ú_putf   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)
r1   r3   r   r   r#   r7   r4   Úupdater*   r   )r   r   r0   ÚrsÚmÚpayloadr   r   r   Ú_getk   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   z   s    zChannel.basic_ackc                 C  s   |   |¡ ¡ d S )z)Return the number of messages in a queue.Zmessage_count)r1   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   é
   r9   r;   r	   )r1   r3   rE   )r   r   r0   ÚnÚresultsrA   r   r   r   Ú_purgeˆ   s    


zChannel._purgec                 C  s    | j  |  |¡¡}| |¡ ¡ S r"   )r   r   r,   r7   r4   )r   r   Z
message_idr0   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   rS   ÚaccountÚuserZapi_keyÚhostrX   rL   rQ   r   r   r   r   ˜   s*    
 
ÿÿ
 þzChannel.slmqc                 C  s   | j jS r"   )Ú
connectionÚclient©r   r   r   r   rS   ­   s    zChannel.conninfoc                 C  s
   | j jjS r"   )r_   r`   rZ   ra   r   r   r   rZ   ±   s    zChannel.transport_optionsc                 C  s   | j  d¡p| jS )Nr-   )rZ   rD   Údefault_visibility_timeoutra   r   r   r   r-   µ   s    ÿzChannel.visibility_timeoutc                 C  s   | j  dd¡S )Nr.   rP   )rZ   rD   ra   r   r   r   r.   º   s    zChannel.queue_name_prefix)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rb   Zdomain_formatrR   r   Úsetr#   r   r%   r'   ÚCHARS_REPLACE_TABLEr,   r1   r5   r8   rC   rF   rG   rK   rE   Úpropertyr   rS   rZ   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)rc   rd   re   rf   r   Zpolling_intervalÚdefault_portr
   rk   Zconnection_errorsr   ÚsocketÚerrorr   r   r   r   rk   ¿   s    ÿÿrk   )rf   Ú
__future__r   rT   rm   Ústringr   r   Zkombu.utils.encodingr   r   Zkombu.utils.jsonr   r   Zkombu.utils.objectsr   rP   r
   Zsoftlayer_messagingr   Zsoftlayer_messaging.errorsr   r   Úpunctuationrh   r   rk   r   r   r   r   Ú<module>   s(   ÿ 