
    tniU                        U d dl Z d dl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
 d dlmZmZmZmZmZmZ d dlZd dlmZmZmZmZ d dlmZ d d	lmZ d d
lmZ ddlmZ  ej         e!          Z"dZ# ed          Z$ G d de%          Z& G d de%          Z' G d de          Z( G d de          Z) G d de          Z*ee*e)f         Z+ eee+ ed          f                   Z,ee+         e-d<   ede.ded         fd             Z/ ed!          Z0 ed"          Z1d ed          fd#e.d$edeee0ee1ddf         f         gee0ee1ddf         f         f         fd%Z2 G d& d'ej3                  Z4dS )(    N)	Generator)contextmanager)	timedelta)wraps)	AnnotatedCallableLiteralOptionalTypeVarUnion)	BaseModelFieldTypeAdapterValidationError)	ParamSpec)__version__)Settings   )Identity      )minutesc                       e Zd ZdZdS )StreamLogErrorz@Raised when there's an error streaming logs (build or app logs).N)__name__
__module____qualname____doc__     X/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/fastapi_cloud_cli/utils/api.pyr   r       s        JJDr    r   c                       e Zd ZdS )TooManyRetriesErrorN)r   r   r   r   r    r!   r#   r#   &   s        Dr    r#   c                   .    e Zd ZU eed<   eed<   eed<   dS )AppLogEntry	timestampmessagelevelN)r   r   r   str__annotations__r   r    r!   r%   r%   *   s+         NNNLLLJJJJJr    r%   c                   @    e Zd ZU ed         ed<   dZee         ed<   dS )BuildLogLineGeneric)completefailedtimeout	heartbeattypeNid)r   r   r   r	   r*   r2   r
   r)   r   r    r!   r,   r,   0   s8         
>
????Br    r,   c                   N    e Zd ZU dZed         ed<   eed<   dZee         ed<   dS )BuildLogLineMessager'   r1   Nr2   )	r   r   r   r1   r	   r*   r)   r2   r
   r   r    r!   r4   r4   5   sD         (D')
(((LLLBr    r4   r1   )discriminatorBuildLogAdapterattempt_numberreturn)NNNc              #      K   d	 fd}	 d V  d S # t           j        t           j        t           j        f$ r0}t                              d|            |             Y d }~d S d }~wt           j        $ r}|j        j        dk    r1t                              d|j        j        |            |             n@	 |j        j	        }n# t          $ r d}Y nw xY wt          d|j        j         d|           |Y d }~d S d }~ww xY w)
Nr8   c                      t          dz  d          } t                              d|            t          j        |            d S )N      zRetrying in %ds (attempt %d))minloggerdebugtimesleep)backoff_secondsr7   s    r!   _backoffzattempt.<locals>._backoffC   sN    a/44*	
 	
 	

 	
?#####r    zNetwork error (will retry): %si  z Server error %d (will retry): %sz(response body unavailable)zHTTP z: r8   N)httpxTimeoutExceptionNetworkErrorRemoteProtocolErrorr>   r?   HTTPStatusErrorresponsestatus_codetext	Exceptionr   )r7   rC   errorerror_details   `   r!   attemptrP   A   sg     $ $ $ $ $ $ 	!   
 	5u===








    >%,,LL2*  
 HJJJJ=$~2 = = =<= D2DDlDD  JJJJJsE    &D %A""D 4AC;6CC;CC;C#C;;D PTtotal_attemptsr/   c           	           dt           t          t          t          d d f         f         dt           t          t          t          d d f         f         f fd}|S )Nfuncr8   c           
           t                     dt          j        dt          j        dt          t
          d d f         f fd            }|S )Nargskwargsr8   c               ?     K   t          j                    }t                    D ]}t          j                    |z
                                  k    r&t	          d                                dd          t          |          5   | i |E d {V  	 d d d             d S # 1 swxY w Y   t          d d          )NzLog streaming timed out after z.0fszFailed after z	 attempts)r@   	monotonicrangetotal_secondsTimeoutErrorrP   r#   )rW   rX   startr7   rU   r/   rS   s       r!   wrapperz,attempts.<locals>.decorator.<locals>.wrapperw   s8     N$$E"'"7"7 	 	>##e+g.C.C.E.EEE&W9N9N9P9PWWWW   ^,,  #tT4V444444444                 
 &&On&O&O&OPPPs   	B''B+	.B+	)r   rQ   rW   rX   r   rR   )rU   r`   r/   rS   s   ` r!   	decoratorzattempts.<locals>.decoratort   st     
t	Q16 	QQX 	Q)AtTM:R 	Q 	Q 	Q 	Q 	Q 	Q 	Q 
	Q  r    )r   rQ   r   rR   )rS   r/   ra   s   `` r!   attemptsrb   o   si    
q)AtTM223	!Yq$}--	.      , r    c                        e Zd Zd fdZ eee          dedee	ddf         fd            Z
dedee	         fdZ eee          ded	ed
ededeeddf         f
d            Z xZS )	APIClientr8   Nc                     t          j                    }t                      }t                                          |j        t          j        d          d|j         dt           d           d S )N   zBearer zfastapi-cloud-cli/)Authorizationz
User-Agent)base_urlr/   headers)
r   getr   super__init__base_api_urlrE   Timeouttokenr   )selfsettingsidentity	__class__s      r!   rl   zAPIClient.__init__   sw    <>>::*M"%%!;8>!;!;@;@@  	 	
 	
 	
 	
 	
r    deployment_idc              #     K   d }	 |rd|ind }|                      dd| dd|          5 }|                                 |                                D ]}|r|                                s|                     |          x}r_|j        r|j        }|j        dk    r|V  |j        d	v r|V   d d d            d S |j        d
k    rt                              d            n/t                              d           t          j
        d          	 d d d            n# 1 swxY w Y   t          j        d           :)NTlast_idGETz/deployments/z/build-logs<   )r/   paramsr'   )r-   r.   r/   zReceived timeout; reconnectingz4Connection closed by server unexpectedly; will retryz(Connection closed without terminal stateg      ?)streamraise_for_status
iter_linesstrip_parse_log_liner2   r1   r>   r?   rE   rG   r@   rA   )rp   rt   rv   ry   rJ   linelog_lines          r!   stream_build_logszAPIClient.stream_build_logs   s      "	-4>i))$F::::	    Y
 ))+++$//11 Y YD !tzz|| ! #'#7#7#=#==x "#; 2&.kG#=I55"*NNN#=,BBB"*NNN"+Y Y Y Y Y Y Y Y. $=I55"LL)IJJJ!ELL!WXXX,-WXXX	 "3Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y> JsOOOE"	s   BD<ADD#&D#r   c                     	 t                               |          S # t          t          j        f$ r/}t
                              d|d d         |           Y d }~d S d }~ww xY w)Nz&Skipping malformed log: %s (error: %s)d   )r6   validate_jsonr   jsonJSONDecodeErrorr>   r?   )rp   r   es      r!   r~   zAPIClient._parse_log_line   sn    	"00666!56 	 	 	LLA4:qQQQ44444	s    A!$AA!app_idtailsincefollowc              #     K   |rdnd}|                      dd| d|||d|          5 }|                                 |                                D ]}|r|                                s	 t	          j        |          }n0# t          j        $ r t                              d|           Y \w xY w|	                    d	          d
k    rz|	                    d	          dk    r#t          |	                    dd                    	 t                              |          V  # t          $ r&}	t                              d||	           Y d }	~	d }	~	ww xY w	 d d d            d S # 1 swxY w Y   d S )Nx   r<   rw   z/apps/z/logs/stream)r   r   r   )ry   r/   zFailed to parse log line: %sr1   r0   rN   r'   zUnknown errorz"Failed to parse log entry: %s - %s)rz   r{   r|   r}   r   loadsr   r>   r?   rj   r   r%   model_validater   )
rp   r   r   r   r   r/   rJ   r   datar   s
             r!   stream_app_logszAPIClient.stream_app_logs   s       '##R[[)V)))  
   	
 	
 	 %%''' ++--   4::<< :d++DD+   LL!?FFFH 88F##{2288F##w..()_)M)MNNN%44T::::::&   LL!EtQOOOHHHH#	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	sa   AE(.BE(*B0-E(/B00AE(
D'&E('
E1EE(EE((E,/E,rD   )r   r   r   rl   rb   STREAM_LOGS_MAX_RETRIESSTREAM_LOGS_TIMEOUTr)   r   BuildLogLiner   r
   r~   intboolr%   r   __classcell__)rs   s   @r!   rd   rd      s       
 
 
 
 
 
 X%':;;' '	<t+	,' ' ' <;'RC H\,B     X%':;;&& & 	&
 & 
;d*	+& & & <;& & & & &r    rd   )5r   loggingr@   collections.abcr   
contextlibr   datetimer   	functoolsr   typingr   r   r	   r
   r   r   rE   pydanticr   r   r   r   typing_extensionsr   fastapi_cloud_clir   fastapi_cloud_cli.configr   authr   	getLoggerr   r>   r   r   rM   r   r#   r%   r,   r4   r   r6   r*   r   rP   rQ   rR   rb   Clientrd   r   r    r!   <module>r      s      % % % % % % % % % % % %                             C C C C C C C C C C C C ' ' ' ' ' ' ) ) ) ) ) ) - - - - - -      		8	$	$ i*** 	 	 	 	 	Y 	 	 		 	 	 	 	) 	 	 	    )       )   
    )    (*==>-8[lEE77778. .\*   
 &C &I.>$? & & & &R IcNNGCLL ))A2F2F2F &/a1dD=))*+Xa1dD=9Q6Q-RR   <f f f f f f f f f fr    