o
    DfG                     @  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   M/home/ubuntu/webapp/venv/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,     