o
    $i9                     @   st  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
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mZ d dlmZ d dlm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+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 e6e7Z8eddZ9e:dZ;G dd de$e,Z<dS )    N)ThreadPoolExecutor)asdict)datetime)Optional)Response)ActorID)TagKeyrecord_extra_usage_tag)env_integer)ActorTableData)!RAY_STATE_SERVER_MAX_HTTP_REQUEST)RAY_STATE_SERVER_MAX_HTTP_REQUEST_ALLOWED*RAY_STATE_SERVER_MAX_HTTP_REQUEST_ENV_NAME)LogsManager)StateAPIManager)do_replyhandle_list_apihandle_summary_apioptions_from_req)SubprocessModule)SubprocessRouteTable)ResponseType)HTTPStatusCodeRateLimitedModule)DEFAULT_DOWNLOAD_FILENAMEDEFAULT_LOG_LIMITDEFAULT_RPC_TIMEOUTGetLogOptions)DataSourceUnavailable)StateDataSourceClient(RAY_DASHBOARD_STATE_HEAD_TPE_MAX_WORKERS   s   \x5b[(0-9);]+mc                   @   s  e Zd ZdZdd Zdd Zedej	de
jjde
jjfd	d
Zedej	de
jjde
jjfddZedej	de
jjde
jjfddZedej	de
jjde
jjfddZedej	de
jjde
jjfddZedej	de
jjde
jjfddZedej	de
jjde
jjfddZedej	de
jjde
jjfddZed ej	de
jjde
jjfd!d"Zejd#ejd$ej	de
jjde
jjfd%d&Zed'ej	de
jjde
jjfd(d)Zed*ej	de
jjde
jjfd+d,Zed-ej	de
jjde
jjfd.d/Zed0ej	de
jjde
jjfd1d2Zed3de
jjfd4d5Zd6d7 Zd8S )9	StateHeadzModule to obtain state information from the Ray cluster.

    It is responsible for state observability APIs such as
    ray.list_actors(), ray.get_actor(), ray.summary_actors().
    c                 O   sl   t j| g|R i | t| ttt d| _d| _d| _t	t
dd| _| jdus,J tjj s4J dS )z>Initialize for handling RESTful requests from State API ClientNstate_head_executor)max_workersthread_name_prefix)r   __init__r   minr   r   _state_api_data_source_client
_state_api_log_apir   r    	_executor
gcs_clientrayexperimentalinternal_kv_internal_kv_initialized)selfargskwargs r4   c/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/ray/dashboard/modules/state/state_head.pyr&   ?   s"   zStateHead.__init__c                    s&   t tjd| j dt dt d dS )Nz#Max number of in-progress requests=zB reached. To set a higher limit, set environment variable: export z='xxx'. Max allowed = status_codeerror_messageresult)r   r   TOO_MANY_REQUESTSmax_num_call_r   r   r1   r4   r4   r5   limit_handler_W   s   zStateHead.limit_handler_z/api/v0/actorsreqreturnc                    "   t tjd t| jj|I d H S N1)r	   r   CORE_STATE_API_LIST_ACTORSr   r)   list_actorsr1   r>   r4   r4   r5   rD   d      zStateHead.list_actorsz/api/v0/jobsc              
      sv   t tjd z| jjt|dI d H }ttjdt	|dW S  t
y: } zttjt|d dW  Y d }~S d }~ww )NrB   )option r6   )r	   r   CORE_STATE_API_LIST_JOBSr)   	list_jobsr   r   r   OKr   r   INTERNAL_ERRORstr)r1   r>   r9   er4   r4   r5   rJ   j   s"   zStateHead.list_jobsz/api/v0/nodesc                    r@   rA   )r	   r   CORE_STATE_API_LIST_NODESr   r)   
list_nodesrE   r4   r4   r5   rP   |   rF   zStateHead.list_nodesz/api/v0/placement_groupsc                    r@   rA   )r	   r   $CORE_STATE_API_LIST_PLACEMENT_GROUPSr   r)   list_placement_groupsrE   r4   r4   r5   rR      s   zStateHead.list_placement_groupsz/api/v0/workersc                    r@   rA   )r	   r   CORE_STATE_API_LIST_WORKERSr   r)   list_workersrE   r4   r4   r5   rT      rF   zStateHead.list_workersz/api/v0/tasksc                    r@   rA   )r	   r   CORE_STATE_API_LIST_TASKSr   r)   
list_tasksrE   r4   r4   r5   rV      rF   zStateHead.list_tasksz/api/v0/objectsc                    r@   rA   )r	   r   CORE_STATE_API_LIST_OBJECTSr   r)   list_objectsrE   r4   r4   r5   rX      rF   zStateHead.list_objectsz/api/v0/runtime_envsc                    r@   rA   )r	   r    CORE_STATE_API_LIST_RUNTIME_ENVSr   r)   list_runtime_envsrE   r4   r4   r5   rZ      rF   zStateHead.list_runtime_envsz/api/v0/logsc              
      s   t tjd |jdd}|jdd}|jdd}t|jdt}|s1|s1ttj	ddd	S |s<| j
|I dH }|sIttjd
| dd	S z| j
j|||dI dH }W n tys } zttjt|dd	W  Y d}~S d}~ww ttjd|d	S )zReturn a list of log files on a given node id.

        Unlike other list APIs that display all existing resources in the cluster,
        this API always require to specify node id and node ip.
        rB   glob*node_idNnode_iptimeoutzOBoth node id and node ip are not provided. Please provide at least one of them.r6   z1Cannot find matching node_id for a given node ip )glob_filterrH   )r	   r   CORE_STATE_API_LIST_LOGSquerygetintr   r   r   BAD_REQUESTr*   ip_to_node_id	NOT_FOUND	list_logsr   rL   rM   rK   )r1   r>   r`   r]   r^   r_   r9   rN   r4   r4   r5   rh      sJ   zStateHead.list_logsz/api/v0/logs/{media_type})	resp_typec           
         sb  t tjd tt|jdt|jdd|jdd|jdd|jdd|jd	t	|jd
d|jdd|jdd|jdd|jdt
|jdd|jdd|jddd}|jdd}t|trs| dk}td|  td|  d
tdtt f fdd}tjjdd|j did }d!|_ j||}z!| I dH }|rtd"|}||I dH  ||I dH  W n. ty   Y n& t j!y   |"    t#y } zt$d# tjj%t|d$d}~ww z|2 z3 dH W }	|r
td"|	}	||	I dH  q6 W n t#y'   t$d# |"   w |& I dH  |S )%z7
        Fetches logs from the given criteria.
        rB   r_   r]   Nr^   
media_typefilefilenamedownload_filenameactor_idtask_idsubmission_idpidlinesintervalsuffixoutattempt_numberr   )r_   r]   r^   rj   rl   rm   rn   ro   rp   rq   rr   rs   rt   rv   filter_ansi_codeFtruezStreaming logs with options: zFiltering ANSI escape codes: r?   c                    s.    j j| dI d H }t|dkrd S ||  S )N)rn   r   )r,   async_get_all_actor_infolen)rn   actor_info_dictr<   r4   r5   get_actor_fn   s   z(StateHead.get_logs.<locals>.get_actor_fnContent-Dispositionzattachment; filename="")headersz
text/plain    zError while streaming logs)text)'r	   r   CORE_STATE_API_GET_LOGr   rd   rb   rc   r   
match_infor   r   
isinstancerM   lowerloggerinfor   r   r   aiohttpwebStreamResponserm   content_typer*   stream_logs	__anext__ANSI_ESC_PATTERNsubpreparewriteStopAsyncIterationasyncioCancelledErrorforce_close	Exception	exceptionHTTPInternalServerError	write_eof)
r1   r>   optionsfiltering_ansi_coder|   responselogs_genfirst_chunkrN   logsr4   r<   r5   get_logs   s|   


zStateHead.get_logsz/api/v0/tasks/summarizec                    r@   rA   )r	   r   CORE_STATE_API_SUMMARIZE_TASKSr   r)   summarize_tasksrE   r4   r4   r5   r   ,  rF   zStateHead.summarize_tasksz/api/v0/actors/summarizec                    r@   rA   )r	   r   CORE_STATE_API_SUMMARIZE_ACTORSr   r)   summarize_actorsrE   r4   r4   r5   r   2  rF   zStateHead.summarize_actorsz/api/v0/objects/summarizec                    r@   rA   )r	   r    CORE_STATE_API_SUMMARIZE_OBJECTSr   r)   summarize_objectsrE   r4   r4   r5   r   8  rF   zStateHead.summarize_objectsz/api/v0/tasks/timelinec                    sp   |j d}|j d}| j|I d H }|dkr/t d}d| d| d}d|i}nd }t|d	|d
S )Njob_iddownloadrB   z%Y-%m-%d_%H-%M-%Szattachment; filename="timeline--z.json"r}   zapplication/json)r   r   r   )rb   rc   r)   generate_task_timeliner   nowstrftimer   )r1   r>   r   r   r9   now_strcontent_dispositionr   r4   r4   r5   tasks_timeline>  s   
zStateHead.tasks_timelinez/api/v0/delay/{delay_s}c                    s6   t |jdd}t|I dH  ttjdi ddS )z/Testing only. Response after a specified delay.delay_s
   NrH   )r7   r8   r9   partial_failure_warning)rd   r   rc   r   sleepr   r   rK   )r1   r>   delayr4   r4   r5   delayed_responseO  s   zStateHead.delayed_responsec                    sF   t | I d H  | j}t|| j| _t| j| j| _t	| j| _
d S )N)r   runaiogrpc_gcs_channelr   r,   r(   r   r+   r)   r   r*   )r1   gcs_channelr4   r4   r5   r   [  s   zStateHead.runN) __name__
__module____qualname____doc__r&   r=   routesrc   r   enforce_max_concurrent_callsr   r   Requestr   rD   rJ   rP   rR   rT   rV   rX   rZ   rh   r   STREAMr   r   r   r   r   r   r   r4   r4   r4   r5   r"   8   sj    1Ur"   )=r   loggingreconcurrent.futuresr   dataclassesr   r   typingr   aiohttp.webr   r   r-   r   ray._common.usage.usage_libr   r	   ray._private.ray_constantsr
   ray.core.generated.gcs_pb2r   ray.dashboard.constsr   r   r   %ray.dashboard.modules.log.log_managerr   ray.dashboard.state_aggregatorr   ray.dashboard.state_api_utilsr   r   r   r   !ray.dashboard.subprocesses.moduler   !ray.dashboard.subprocesses.routesr   r    ray.dashboard.subprocesses.utilsr   ray.dashboard.utilsr   r   ray.util.state.commonr   r   r   r   ray.util.state.exceptionr   ray.util.state.state_managerr   	getLoggerr   r   r    compiler   r"   r4   r4   r4   r5   <module>   s>    

