
    ce)                    8   U d Z ddlmZ g dZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZ ddlZddlmZ ddlZddlmZ ddlmZ dd	lmZ d
dlmZ e
j        rddlmZ d
dlmZ d Z  G d de!ej"                  Z# G d dej$                  Z%da&de'd<   ddZ(dS )zClient for Cloud API    )annotations)EnvironmentSort	_CloudAPICloudAPIN)parse)QtCore)config)logger)workers   )	utilities)user)typesc                     	 t          j        d           t          j                                         dS # t
          $ r Y dS w xY w)za
    Cancel login process.

    This should kill server started by :meth:`~_CloudAPI.login`.
    z shutting down cloud login serverN)r
   debuganaconda_cloud_authhandlersshutdown_all_servers	Exception     @lib/python3.11/site-packages/anaconda_navigator/api/cloud/api.pycancel_loginr      sU    7888$99;;;;;   s   26 
AAc                  *    e Zd ZdZdZdZdZdZdZdZ	dS )	r   z Options for environment sorting.namez-name
created_atz-created_at
updated_atz-updated_atN)
__name__
__module____qualname____doc__NAME_ASC	NAME_DESCCREATED_ASCCREATED_DESCUPDATED_ASCUPDATED_DESCr   r   r   r   r   ,   s2        **HIK LK LLLr   r   c                       e Zd ZdZ ej                    Zd'd( fdZd)d
Zd*dZ	d+dZ
ed,d            Zed-d            Z ej         ej        e                    d+d            Zej        d*d            Zej        d.d            Zej        d+d            Zej        ddej        fd/d            Zej        d0d"            Zej        d'd1d$            Zej        d2d%            Zej        d0d&            Z xZS )3r   zE
    Anaconda Cloud API.

    :param: Navigator's config object.
    Nr	   'typing.Optional[user_config.UserConfig]returnNonec                   t                                                       |t          j        }|| _        d| _        i | _        t          j        | j        	                    dd          pddddddd	d
d
ddddd          | _
        t          j                    | _        | j                            | j                   |                                  dS )z+Initialize new :class:`~CloudAPI` instance.Nmaincloud_base_url zapi/iam/tokenzapi/iam/logout)loginlogoutzapi/account)pingaccountzapi/environments/myzapi/environments/my/{name}zapi/environments/my/{name}.yml)list_environmentscreate_environmentupdate_environmentdelete_environmentdownload_environment)authenticationbasicsenvironments)base_url	endpoints)super__init__navigator_configCONF_CloudAPI__config_CloudAPI__token_CloudAPI__accountr   EndpointCollectionget_CloudAPI__routesSession_CloudAPI__sessionsig_token_changedconnect_CloudAPI__refresh_session_CloudAPI__load_token)selfr	   	__class__s     r   r?   z_CloudAPI.__init__B   s    >%*F>D-1CEDMD`]&&v/?@@FB -.# #
 , 
 *?*?*F*F,L! ! E
 E
 E
* ;D:K:M:M&&t'=>>>r   token
str | Nonec                F    || _         | j                                         dS )zUpdate token value.N)rC   rJ   emit)rN   rP   s     r   __set_tokenz_CloudAPI.__set_tokeng   s$    ##%%%%%r   boolc                Z   d}	 t           j        j                            | j                            ddt           j                                        j                            }|                                }n# t          $ r Y nw xY w| 
                    |           t          |          S )z)Try to load exising token in the keyring.Nr-   auth_domain)domain)r   client	TokenInfoloadrB   rF   
AuthConfigrX   get_access_tokenr   _CloudAPI__set_tokenrU   )rN   access_token
token_infos      r   __load_tokenz_CloudAPI.__load_tokenl   s    #'	M`MgMqMvMv}((@S@Z@e@e@g@g@noo Nw N NJ &6688LL 	 	 	D	 	&&&L!!!s   A4A9 9
BBc                j    d| j         pd | j        j        d<   |                                 | _        dS )z*Inject authorization details into session.zBearer r/   AuthorizationN)rP   rI   headersr3   rD   rN   s    r   __refresh_sessionz_CloudAPI.__refresh_sessionz   s3    2NDJ<L"2N2N/r   typing.Optional[str]c                    | j         S )Current authorization token.)rC   re   s    r   rP   z_CloudAPI.token   s     |r   strc                ~    t          | j        pi                     di                               dd                    S )ri   r   emailr/   )rj   rD   rF   re   s    r   usernamez_CloudAPI.username   s9     DN(b--fb99==grJJKKKr   c                    	 t          j                     n&# t          $ r}t          j                    |d}~ww xY w|                                 st          j                    dS )zPerform user authorization.N)r   r0   r   r   TaskFailedErrorrM   )rN   errors     r   r0   z_CloudAPI.login   sv    	7%'''' 	7 	7 	7)++6	7  "" 	,)+++	, 	,s    
949c                    	 | j                             d| j        j        j        dd          j        dk     S # t          j        $ r Y dS w xY w)!Check if API server is available.GETF   allow_redirectstimeouti  )rI   requestrG   r:   r2   status_coderequestsConnectionErrorre   s    r   r2   z_CloudAPI.ping   sm    	>))$) %	 *  
 C    ' 	 	 	55	s   58 A
A(collections.abc.Mapping[str, typing.Any]c                    | j                             d| j        j        j        dd                                          S )rr   rs   Frt   ru   )rI   rx   rG   r:   r3   jsonre   s    r   r3   z_CloudAPI.account   sB     ~%%M (!	 & 
 

 $&&	r   c                V    t          j                     |                     d           dS )z$Remove token data and clear session.N)r   r1   r^   re   s    r   r1   z_CloudAPI.logout   s-     	"$$$r   d   r   limitintoffsetsortr   "'types.CloudEnvironmentCollection'c                    | j                             d| j        j        j        |||dd                                          S )a[  
        List available environments for current user.

        :param limit: Maximum number of environments to fetch in a single call.
        :param offset: Number of environments to skip from the start.
        :param sort: How environments in the result should be sorted.
        :return: Collection of environments available to user.
        rs   )r   r   r   T)paramsraise_for_status)rI   rx   rG   r;   r4   r~   )rN   r   r   r   s       r   r4   z_CloudAPI.list_environments   sT     ~%%M&8  
 " & 	
 	
 $&&		r   r   pathc                   t          j                    \  }}t          j        |dd          5 }t	          j        |          }t          |dd          5 }|                    ||d           ddd           n# 1 swxY w Y   |                    dd           | j	        
                    d| j        j        j        |d	
           ddd           n# 1 swxY w Y   t          j        |           dS )z
        Create a new environment in Cloud.

        :param name: Name of the environment to create.
        :param path: Path to the exported environment (yaml file).
        wt+utf-8encodingrtr   yamlNr   POSTTdatar   )tempfilemkstemposfdopenr   
JsonWriteropen	serializeseekrI   rx   rG   r;   r5   remove)rN   r   r   file_descriptor	file_pathfile_streamfile_writerstreams           r   r5   z_CloudAPI.create_environment   s    &.%5%7%7" Y@@@ 	K090D[0Q0QK dD7333 Fv%%tV&D&DEEEF F F F F F F F F F F F F F F Q"""N""*= !%	 #   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 		)s6   'CA:.C:A>	>CA>	ACCC	rename_toc           
     B   ||}t          j                    \  }}t          j        |dd          5 }t	          j        |          }t          |dd          5 }|                    ||d           ddd           n# 1 swxY w Y   |                    dd           | j	        
                    d| j        j        j                            t          j        |d	
                    |d           ddd           n# 1 swxY w Y   t          j        |           dS )z
        Update environment in Cloud.

        :param name: Name of the environment to update.
        :param path: Path to the exported environment (yaml file).
        :param rename_to: Optional name to change Cloud environment to.
        Nr   r   r   r   r   r   PUTr/   stringsafer   Tr   )r   r   r   r   r   r   r   r   r   rI   rx   rG   r;   r6   formatr   quoter   )	rN   r   r   r   r   r   r   r   r   s	            r   r6   z_CloudAPI.update_environment   s    I &.%5%7%7" Y@@@ 	K090D[0Q0QK dD7333 Kv%%y&&I&IJJJK K K K K K K K K K K K K K K Q"""N""*=DDDr::: E   !!% #   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	$ 		)s6   'D A>2D >B	D B	A.D  DDc           	         | j                             d| j        j        j                            t          j        |d                    d           dS )zi
        Remove environment from Cloud.

        :param name: Name of the environment to remove.
        DELETEr/   r   r   T)r   N)rI   rx   rG   r;   r7   r   r   r   )rN   r   s     r   r7   z_CloudAPI.delete_environment  sh     	M&9@@[2666 A   " 	 	
 	
 	
 	
 	
r   c           	     6   | j                             d| j        j        j                            t          j        |d                    dd          }t          |d          5 }t          j
        |j        |           ddd           dS # 1 swxY w Y   dS )	z
        Download environment description file from the Cloud.

        :param name: Name of the environment to download.
        :param path: Path to store downloaded environment to.
        rs   r/   r   r   T)r   r   wbN)rI   rx   rG   r;   r8   r   r   r   r   shutilcopyfileobjraw)rN   r   r   responser   s        r   r8   z_CloudAPI.download_environment   s     )-(>(>M&;BB[2666 C   " )? )
 )
 $ 	5x|V444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5s   &BBB)N)r	   r)   r*   r+   )rP   rQ   r*   r+   )r*   rU   )r*   r+   )r*   rg   )r*   rj   )r*   r|   )r   r   r   r   r   r   r*   r   )r   rj   r   rj   r*   r+   )r   rj   r   rj   r   rg   r*   r+   )r   rj   r*   r+   )r   r   r    r!   r   SignalrJ   r?   r^   rM   rL   propertyrP   rm   r   TaskAddCancelCallbackr   r0   r2   r3   r1   r   r"   r4   r5   r6   r7   r8   __classcell__)rO   s   @r   r   r   9   sA         &# # # # # # #J& & & &
" " " "( ( ( (
    X L L L XL W\+'+L99::, , , ;:, \
 
 
 \
 \   \ \   \ \ $3$<	    \2 \   \: \" " " " \"H \
 
 
 \
 \5 5 5 \5 5 5 5 5r   r   ztyping.Optional[_CloudAPI]CLOUD_API_INSTANCEr*   c                 :    t           t                      a t           S )z&Retrieve :class:`~_CloudAPI` instance.)r   r   r   r   r   r   r   9  s     !&[[r   )r*   r   ))r!   
__future__r   __all__collections.abccollectionsenumr   r   r   typingurllibr   anaconda_cloud_auth.handlersr   qtpyr   rz   anaconda_navigatorr	   r@   anaconda_navigator.utils.logsr
   anaconda_navigator.utilsr   r/   r   TYPE_CHECKINGanaconda_navigator.configr   user_configr   r   rj   Enumr   QObjectr   r   __annotations__r   r   r   r   <module>r      s      " " " " " "
6
6
6      				          # # # #        9 9 9 9 9 9 0 0 0 0 0 0 , , , , , ,      	 ======
 
 

! 
! 
! 
! 
!c49 
! 
! 
!z5 z5 z5 z5 z5 z5 z5 z5z 26  5 5 5 5     r   