o
    —¨ÊhG  ã                   @  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yQ   d ZZY nw 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 vrt |ƒd“qS )Ú_é_   )Úord)Ú.0Úc© r   úF/var/www/html/env/lib/python3.10/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                   sD   t d u rtdƒ‚tƒ j|i |¤Ž | 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||g|¢R i |¤ŽS ©N)Ú_noack_queuesÚaddr   Úbasic_consume)r   r   Úno_ackr   r   r    r   r   r%   A   s   ÿÿzChannel.basic_consumec                   s,   || j v r| j| }| j |¡ tƒ  |¡S r"   )Ú
_consumersÚ_tag_to_queuer#   Údiscardr   Úbasic_cancel)r   Ú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   ó   zChannel.entity_namec                 K  st   |   | j| ¡}z| j| W S  ty9   z| jj|| jd� W n	 ty)   Y nw | j |¡ }| j|< | Y S w )zEnsure a queue exists in SLQS.)Úvisibility_timeout)	r0   Úqueue_name_prefixr   ÚKeyErrorr   Úcreate_queuer2   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)r0   r   Úpopr   r   Údeleter   Ú_delete)r   r   r   r   Ú
queue_namer    r   r   r;   _   s   
zChannel._deletec                 K  s   |   |¡}| t|ƒ¡ dS )zPut message onto queue.N)r7   Úpushr   )r   r   Úmessager   r6   r   r   r   Ú_putf   s   
zChannel._putc                 C  s€   |   |¡}| d¡}|d r=|d d }tt|d ƒƒ}|| jv r,| |d ¡ ¡  |S |d d  |d |jdœ¡ |S t	ƒ ‚)	z/Try to retrieve a single message off ``queue``.r	   Úitemsr   ÚbodyÚidÚ
propertiesÚdelivery_info)Úslmq_message_idÚslmq_queue_name)
r7   r9   r   r   r#   r>   r:   Úupdater.   r   )r   r   r6   ÚrsÚmÚpayloadr   r   r   Ú_getk   s   


þ
ÿzChannel._getc                   sN   | j  |¡j}z|d }W n	 ty   Y n	w |  ||d ¡ tƒ  |¡ d S )NrF   rE   )ÚqosÚgetrD   r4   Údelete_messager   Ú	basic_ack)r   Údelivery_tagrD   r   r    r   r   rO   z   s   ÿzChannel.basic_ackc                 C  s   |   |¡ ¡ d S )z)Return the number of messages in a queue.Úmessage_count)r7   Údetail)r   r   r   r   r   Ú_size„   r1   zChannel._sizec                 C  s\   |   |¡}d}| d¡}|d r,|d D ]}|  ||d ¡ |d7 }q| d¡}|d s|S )z'Delete all current messages in a queue.r   é
   r@   rB   r	   )r7   r9   rN   )r   r   r6   ÚnÚresultsrI   r   r   r   Ú_purgeˆ   s   



üzChannel._purgec                 C  s    | j  |  |¡¡}| |¡ ¡ S r"   )r   r   r0   r>   r:   )r   r   Ú
message_idr6   r   r   r   rN   ”   s   zChannel.delete_messagec           	      C  sÄ   | j d u 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¡¡p=dƒ}d	 |rEd
nd||rNd|› �nd¡}t||d�| _ | j  ||¡ | j S )NÚSLMQ_ACCOUNTÚSL_USERNAMEÚ
SL_API_KEYÚ	SLMQ_HOSTÚ	SLMQ_PORTÚSLMQ_SECUREÚsecureTz	{}://{}{}ÚhttpsÚhttpú:Ú )Úendpoint)Ú_slmqÚconninfoÚosÚenvironrM   Úvirtual_hostÚuseridÚpasswordÚhostnameÚportÚboolÚtransport_optionsÚformatr   Úauthenticate)	r   rf   ÚaccountÚuserÚapi_keyÚhostrm   r_   rd   r   r   r   r   ˜   s&   
ÿÿþzChannel.slmqc                 C  s   | j jS r"   )Ú
connectionÚclient©r   r   r   r   rf   ­   s   zChannel.conninfoc                 C  s
   | j jjS r"   )rv   rw   ro   rx   r   r   r   ro   ±   s   
zChannel.transport_optionsc                 C  s   | j  d¡p| jS )Nr2   )ro   rM   Údefault_visibility_timeoutrx   r   r   r   r2   µ   s   ÿzChannel.visibility_timeoutc                 C  s   | j  dd¡S )Nr3   rc   )ro   rM   rx   r   r   r   r3   º   s   zChannel.queue_name_prefix)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ry   Údomain_formatre   r   Úsetr#   r   r%   r*   ÚCHARS_REPLACE_TABLEr0   r7   r;   r?   rK   rO   rS   rW   rN   Úpropertyr   rf   ro   r   r2   r3   Ú__classcell__r   r   r    r   r   .   s:    





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)rz   r{   r|   r}   r   Úpolling_intervalÚdefault_portr
   rƒ   Úconnection_errorsr   ÚsocketÚerrorr   r   r   r   rƒ   ¿   s    ÿÿrƒ   )r}   Ú
__future__r   rg   r‡   Ústringr   r   Úkombu.utils.encodingr   r   Úkombu.utils.jsonr   r   Úkombu.utils.objectsr   rc   r
   Úsoftlayer_messagingr   Úsoftlayer_messaging.errorsr   r   Úpunctuationr€   r   rƒ   r   r   r   r   Ú<module>   s,    ÿÿ 