
    ^f"                    D   d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZ ddlmZmZ dd	lmZ d
dlmZ 	 ddlmZ n# e$ r dZY nw xY w	 ddlmZmZ n# e$ r dZdZY nw xY wd ej        D             Z G d dej                  Z G d dej                  ZdS )a  Azure Storage Queues transport module for kombu.

More information about Azure Storage Queues:
https://azure.microsoft.com/en-us/services/storage/queues/

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

Connection String
=================

Connection string has the following formats:

.. code-block::

    azurestoragequeues://<STORAGE_ACCOUNT_ACCESS_KEY>@<STORAGE_ACCOUNT_URL>
    azurestoragequeues://<SAS_TOKEN>@<STORAGE_ACCOUNT_URL>
    azurestoragequeues://DefaultAzureCredential@<STORAGE_ACCOUNT_URL>
    azurestoragequeues://ManagedIdentityCredential@<STORAGE_ACCOUNT_URL>

Note that if the access key for the storage account contains a forward slash
(``/``), it will have to be regenerated before it can be used in the connection
URL.

.. code-block::

    azurestoragequeues://DefaultAzureCredential@<STORAGE_ACCOUNT_URL>
    azurestoragequeues://ManagedIdentityCredential@<STORAGE_ACCOUNT_URL>

If you wish to use an `Azure Managed Identity` you may use the
``DefaultAzureCredential`` format of the connection string which will use
``DefaultAzureCredential`` class in the azure-identity package. You may want to
read the `azure-identity documentation` for more information on how the
``DefaultAzureCredential`` works.

.. _azure-identity documentation:
https://learn.microsoft.com/en-us/python/api/overview/azure/identity-readme?view=azure-python
.. _Azure Managed Identity:
https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview

Transport Options
=================

* ``queue_name_prefix``
    )annotationsN)Empty)AnyOptional)ResourceExistsError)safe_str)dumpsloads)cached_property   )virtual)QueueServiceClient)DefaultAzureCredentialManagedIdentityCredentialc                .    i | ]}t          |          d S )-   )ord).0cs     T/var/www/html/env/lib/python3.11/site-packages/kombu/transport/azurestoragequeues.py
<dictcomp>r   Q   s-       CFFD      c                      e Zd ZU dZdZded<   dZded<   i Zded	<   d
Zded<    e	            Z
ded<    fdZ fdZefddZd Zd Zd ZddZd Zd Zed d            Zed             Zed             Zedd            Z xZS )!ChannelzAzure Storage Queues channel.zkombu%(vhost)sstrdomain_formatNzOptional[QueueServiceClient]_queue_servicezdict[Any, Any]_queue_name_cacheTboolno_ackzset[Any]_noack_queuesc                    t           t          d           t                      j        |i | t                              | j        j                  \  | _        | _	        | j
                                        D ]}|| j        |d         <   d S )NzGAzure Storage Queues transport requires the azure-storage-queue libraryname)r   ImportErrorsuper__init__	Transport	parse_uriconninfohostname_credential_urlqueue_servicelist_queuesr   )selfargskwargsqueue	__class__s       r   r&   zChannel.__init___   s    % < = = = 	$)&)))&/&9&9M"'
 '
#$) '3355 	: 	:E49D"5=11	: 	:r   c                x    |r| j                             |            t                      j        ||g|R i |S N)r!   addr%   basic_consume)r/   r2   r    r0   r1   r3   s        r   r7   zChannel.basic_consumem   s[     	*""5)))$uww$UF 6&*6 6 6.46 6 	6r   returnc                `    t          t          |                                        |          S )z=Format AMQP queue name into a valid Azure Storage Queue name.)r   r   	translate)r/   r#   tables      r   entity_namezChannel.entity_namet   s$    8D>>"",,U333r   c                v   |                      | j        |z             }	 | j                            | j        |                   }ns# t
          $ rf 	 | j                            |          }n+# t          $ r | j                            |          }Y nw xY w|	                                | j        |<   Y nw xY w|S )zEnsure a queue exists.)r2   )
r<   queue_name_prefixr   get_queue_clientr   KeyErrorr-   create_queuer   get_queue_propertiesr/   r2   qs      r   _ensure_queuezChannel._ensure_queuex   s      !7%!?@@
	E#44,U3 5  AA  	E 	E 	EF&33E::& F F F'88u8EEF -.,B,B,D,DD"5)))	E s5   &A 
B6A,+B6,%BB6BB65B6c                    |                      |          }| j                            |d           | j                            |           dS )zDelete queue by name.N)r<   r   popr-   delete_queue)r/   r2   r0   r1   
queue_names        r   _deletezChannel._delete   sK    %%e,,
"":t444''
33333r   c                x    |                      |          }t          |          }|                    |           dS )zPut message onto queue.N)rE   r	   send_message)r/   r2   messager1   rD   encoded_messages         r   _putzChannel._put   s8    u%%..	'''''r   c                   |                      |          }|                    d|          }	 t          |          }n# t          $ r t	                      w xY wt          |j                  }|                    |           |S )z/Try to retrieve a single message off ``queue``.r   )messages_per_pagetimeout)rM   )rE   receive_messagesnextStopIterationr   r
   contentdelete_message)r/   r2   rR   rD   messagesrM   rV   s          r   _getzChannel._get   s    u%%%%7%KK	8nnGG 	 	 	''M	 ((	)))s	   > Ac                ^    |                      |          }|                                j        S )z)Return the number of messages in a queue.)rE   rB   approximate_message_countrC   s      r   _sizezChannel._size   s*    u%%%%''AAr   c                    |                      |          }|                     |j                  }|                                 |S )z'Delete all current messages in a queue.)rE   r\   rI   clear_messages)r/   r2   rD   ns       r   _purgezChannel._purge   s?    u%%JJq|$$	r   r   c                ^    | j          t          | j        | j                  | _         | j         S )N)account_url
credential)r   r   r,   r+   r/   s    r   r-   zChannel.queue_service   s7    &"4 I$2B# # #D ""r   c                    | j         j        S r5   )
connectionclientrd   s    r   r)   zChannel.conninfo   s    %%r   c                $    | j         j        j        S r5   )rf   rg   transport_optionsrd   s    r   ri   zChannel.transport_options   s    %77r   c                8    | j                             dd          S )Nr>    )ri   getrd   s    r   r>   zChannel.queue_name_prefix   s    %))*=rBBBr   )r8   r   r5   )r8   r   )__name__
__module____qualname____doc__r   __annotations__r   r   r    setr!   r&   r7   CHARS_REPLACE_TABLEr<   rE   rJ   rO   rY   r\   r`   propertyr-   r)   ri   r   r>   __classcell__)r3   s   @r   r   r   V   s        '')M))))37N7777(*****F!ceeM####: : : : :6 6 6 6 6 ': 4 4 4 4 4   4 4 4( ( (    B B B
   # # # X# & & X& 8 8 X8 C C C _C C C C Cr   r   c                  v    e Zd ZU dZeZdZded<   dZded<   dZd	ed
<   e	dd            Z
e	 ddd            ZdS )r'   zAzure Storage Queues transport.r   intpolling_intervalNzOptional[int]default_portTr   can_parse_urlurir   r8   tuple[str | dict, str]c                "   	 |                      dd          } |                     dd          \  }}d                                |                                k    r%t          t	          d          t                      }n\d                                |                                k    r%t
          t	          d          t                      }nd	|v r	d
|vrd	|d}t          ||g          sJ n# t          $ r t          d          w xY w||fS )Nzazurestoragequeues://rk   @r   r   z`Azure Storage Queues transport with a DefaultAzureCredential requires the azure-identity libraryr   zcAzure Storage Queues transport with a ManagedIdentityCredential requires the azure-identity librarydevstoreaccount1z.core.windows.net)account_nameaccount_keyzNeed a URI like azurestoragequeues://{SAS or access key}@{URL}, azurestoragequeues://DefaultAzureCredential@{URL}, , or azurestoragequeues://ManagedIdentityCredential@{URL})	replacersplitlowerr   r$   r   all	Exception
ValueError)r{   rc   urls      r   r(   zTransport.parse_uri   s]   "	++5r::C!jja00OJ'--//:3C3C3E3EEE)1% '? @ @ @ 455

,2244
8H8H8J8JJJ,4% '? @ @ @ 788

#s**/B#/M/M %7#- 
 
C()))))) 	 	 	G  	 3s   C-C0 0D
F**include_passwordmaskc                f    |                      |          \  }}d                    |r|n||          S )Nzazurestoragequeues://{}@{})r(   format)clsr{   r   r   rc   r   s         r   as_urizTransport.as_uri   s?     --,,
C+22*4JJc
 
 	
r   )r{   r   r8   r|   )Fr   )r{   r   r   r   r   r   r8   r   )rm   rn   ro   rp   r   rx   rq   ry   rz   staticmethodr(   classmethodr    r   r   r'   r'      s         ))G"&L&&&&M. . . \.` CG
 
 
 
 [
 
 
r   r'   )rp   
__future__r   stringr2   r   typingr   r   azure.core.exceptionsr   kombu.utils.encodingr   kombu.utils.jsonr	   r
   kombu.utils.objectsr   rk   r   azure.storage.queuer   r$   azure.identityr   r   punctuationrs   r   r'   r   r   r   <module>r      s  2 2h # " " " " "                        5 5 5 5 5 5 ) ) ) ) ) ) ) ) ) ) ) ) ) ) / / / / / /      6666666   %; ; ; ; ; ; ; ; ; % % %! $%  ,   
mC mC mC mC mCgo mC mC mC`A
 A
 A
 A
 A
! A
 A
 A
 A
 A
s#   A AAA 	A&%A&