
    &`i9p                     r   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Zd dlZd dlmZ d dl	m
Z
mZmZmZ d dlZd dlmZ d dlmZmZmZ d dl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m Z  d d
l!m"Z" d dl#m$Z$m%Z%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z9m:Z:m;Z;m<Z< d dl=m>Z>m?Z? d dl@mAZA d dlBmCZD d dlEmFZF  ejG        eH          ZIeIJ                    ejK                    G d deLejM                  ZN G d deejO                  ZP G d d          ZQ G d deA          ZRdS )    N)datetime)AsyncIteratorDictOptionalTuple)ClientResponse)RequestResponseStreamResponse)NodeID)build_address)	BaseModelExtraField	validator)get_or_create_event_loop
load_class)KV_NAMESPACE_DASHBOARD)package_existspin_runtime_env_uriupload_package_to_gcs)#DASHBOARD_AGENT_ADDR_NODE_ID_PREFIXGCS_RPC_TIMEOUT_SECONDSRAY_CLUSTER_ACTIVITY_HOOK&TRY_TO_GET_AGENT_INFO_INTERVAL_SECONDSWAIT_AVAILABLE_AGENT_TIMEOUT)JobDeleteResponseJobInfoStorageClientJobLogsResponseJobStopResponseJobSubmitRequestJobSubmitResponsehttp_uri_components_to_uri)
JobDetailsJobType)find_job_by_idsget_driver_jobsget_head_node_idparse_and_validate_request)CURRENT_VERSIONVersionResponse)SubprocessModule)SubprocessRouteTable)ResponseTypec                       e Zd ZdZdZdZdS )RayActivityStatusACTIVEINACTIVEERRORN)__name__
__module____qualname__r1   r2   r3        v/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/dashboard/modules/job/job_head.pyr0   r0   ;   s        FHEEEr8   r0   c                       e Zd ZU dZ edd          Zeed<    edd          Ze	e
         ed<    edd	          Zeed
<    edd          Ze	e         ed<    edd          d             ZdS )RayActivityResponsez
    Pydantic model used to inform if a particular Ray component can be considered
    active, and metadata about observation.
    .zWhether the corresponding Ray component is considered active or inactive, or if there was an error while collecting this observation.)description	is_activeNz8Reason if Ray component is considered active or errored.reasonzwTimestamp of when this observation about the Ray component was made. This is in the format of seconds since unix epoch.	timestampzTimestamp when last actvity of this Ray component finished in format of seconds since unix epoch. This field does not need to be populated for Ray components where it is not meaningful.last_activity_atT)alwaysc                 \    d|v r'|d         t           j        k    r|t          d          |S )Nr=   z6Reason is required if is_active is "active" or "error")r0   r2   
ValueError)clsvvalueskwargss       r9   reason_requiredz#RayActivityResponse.reason_requireda   sA    &  VK%8<M<V%V%Vy L   r8   )r4   r5   r6   __doc__r   r=   r0   __annotations__r>   r   strr?   floatr@   r   rH   r7   r8   r9   r;   r;   A   s         
 $)5J$ $ $I     "ET  FHSM    uA  Iu    ).=) ) )huo    Yx%%%  &%  r8   r;   )extrac                       e Zd ZdZdefdZdefdZdede	fdZ
d	edefd
Zd	edefdZd	edefdZd	edee         fdZddZdS )JobAgentSubmissionClientzA local client for submitting and interacting with jobs on a specific node
    in the remote cluster.
    Submits requests over HTTP to the job agent on the specific node using the REST API.
    dashboard_agent_addressc                 D    || _         t          j                    | _        d S N)_agent_addressaiohttpClientSession_session)selfrP   s     r9   __init__z!JobAgentSubmissionClient.__init__q   s      6-//r8   respc                 t   K   |j         }|                                 d {V }t          d| d| d          )Nz Request failed with status code z: .)statustextRuntimeError)rW   rY   r\   
error_texts       r9   _raise_errorz%JobAgentSubmissionClient._raise_errorx   sN      99;;&&&&&&
UfUU
UUUVVVr8   reqreturnc                   K   t                               d|j         d           | j                            | j         dt          j        |                    4 d {V 	 }|j        dk    r8|	                                 d {V }t          di |cd d d           d {V  S |                     |           d {V  	 d d d           d {V  d S # 1 d {V swxY w Y   d S )Nz"Submitting job with submission_id=r[   /api/job_agent/jobs/)json   r7   )loggerdebugsubmission_idrV   postrS   dataclassesasdictr\   re   r"   r`   )rW   ra   rY   result_jsons       r9   submit_job_internalz,JobAgentSubmissionClient.submit_job_internal}   s     N#:KNNNOOO=%%"888{?QRU?V?V & 
 
 	. 	. 	. 	. 	. 	. 	. 	.{c!!$(IIKK//////(77;77	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. ''----------	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   #1C'C
C #C job_idc                   K   t                               d| d           | j                            | j         d| d          4 d {V 	 }|j        dk    r8|                                 d {V }t          di |cd d d           d {V  S |                     |           d {V  	 d d d           d {V  d S # 1 d {V swxY w Y   d S )NzStopping job with job_id=r[   rd   z/stoprf   r7   )	rg   rh   rV   rj   rS   r\   re   r    r`   rW   ro   rY   rm   s       r9   stop_job_internalz*JobAgentSubmissionClient.stop_job_internal   s     ::::;;;=%%"EEEEE
 
 	. 	. 	. 	. 	. 	. 	. 	.{c!!$(IIKK//////&5555	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. ''----------	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   1C C  
C
C
c                   K   t                               d| d           | j                            | j         d|           4 d {V 	 }|j        dk    r8|                                 d {V }t          di |cd d d           d {V  S |                     |           d {V  	 d d d           d {V  d S # 1 d {V swxY w Y   d S )NzDeleting job with job_id=r[   rd   rf   r7   )	rg   rh   rV   deleterS   r\   re   r   r`   rq   s       r9   delete_job_internalz,JobAgentSubmissionClient.delete_job_internal   s     ::::;;;=''"@@@@
 
 	. 	. 	. 	. 	. 	. 	. 	.{c!!$(IIKK//////(77;77	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. ''----------	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   1B?B??
C	C	c                 j  K   | j                             | j         d| d          4 d {V 	 }|j        dk    r8|                                 d {V }t          di |cd d d           d {V  S |                     |           d {V  	 d d d           d {V  d S # 1 d {V swxY w Y   d S )Nrd   z/logsrf   r7   )rV   getrS   r\   re   r   r`   rq   s       r9   get_job_logs_internalz.JobAgentSubmissionClient.get_job_logs_internal   s     =$$"EEEEE
 
 	. 	. 	. 	. 	. 	. 	. 	.{c!!$(IIKK//////&5555	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. ''----------	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   1B"3B""
B,/B,c                L  K   | j                             | j         d| d           d{V }	 |                                 d{V }|j        t
          j        j        k    r|j        W V  n7|j        t
          j        j	        k    rdS |j        t
          j        j
        k    r	 w)z/Get an iterator that follows the logs of a job.rd   z
/logs/tailN)rV   
ws_connectrS   receivetyperT   	WSMsgTypeTEXTdataCLOSEDr3   )rW   ro   wsmsgs       r9   tail_job_logsz&JobAgentSubmissionClient.tail_job_logs   s      =++"JJJJJ
 
 
 
 
 
 
 
	

$$$$$$Cx7,111hW.555W.444	r8   Tc                 r   K   	 | j                                          d {V  d S # t          $ r |s Y d S w xY wrR   )rV   close	Exception)rW   ignore_errors     r9   r   zJobAgentSubmissionClient.close   sl      	-%%''''''''''' 	 	 	   	s   % 66N)T)r4   r5   r6   rI   rK   rX   r   r`   r!   r"   rn   r    rr   r   ru   r   rx   r   r   r   r7   r8   r9   rO   rO   k   s         
0!$0 0 0 0W~ W W W W

.-= 
.BS 
. 
. 
. 
.
.c 
.o 
. 
. 
. 
.
. 
.8I 
. 
. 
. 
..# ./ . . . .# -2D          r8   rO   c                   t    e Zd ZdZdZ fdZefdedefdZ	defdZ
dedefdZd	edeeeef         fd
Z ej        d          dedefd            Z ej        d          dedefd            Z ej        d          defd            Z ej        d          dedefd            Z ej        d          dedefd            Z ej        d          dedefd            Z ej        d          dedefd            Z ej        d          dedefd            Z ej        d          dedefd            Z  ej        de!j"                  dede#fd            Z$de%de&e         fdZ' ej        d           de(j)        j        de(j)        j        fd!            Z*d"ede+fd#Z, fd$Z- xZ.S )%JobHeada  Runs on the head node of a Ray cluster and handles Ray Jobs APIs.

    NOTE(architkulkarni): Please keep this class in sync with the OpenAPI spec at
    `doc/source/cluster/running-applications/job-submission/openapi.yml`.
    We currently do not automatically check that the OpenAPI
    spec is in sync with the implementation. If any changes are made to the
    paths in the @route decorators or in the Responses returned by the
    methods (or any nested fields in the Responses), you will need to find the
    corresponding field of the OpenAPI yaml file and update it manually. Also,
    bump the version number in the yaml file and in this class's `get_version`.
       c                      t                      j        |i | d | _        | j        J t          j        j                                        sJ t                      | _	        d S rR   )
superrX   _job_info_client
gcs_clientrayexperimentalinternal_kv_internal_kv_initializeddict_agents)rW   argsrG   	__class__s      r9   rX   zJobHead.__init__   sh    $)&))) $ ***+DDFFFFF @Dvvr8   	timeout_srb   c                 <   K   |                      |           d{V S )at  
        Get a `JobAgentSubmissionClient`, which is a client for interacting with jobs
        via an agent process.

        Args:
            timeout_s: The timeout for the operation.

        Returns:
            A `JobAgentSubmissionClient` for interacting with jobs via an agent process.

        Raises:
            TimeoutError: If the operation times out.
        N)_get_head_node_agent)rW   r   s     r9   get_target_agentzJobHead.get_target_agent   s.        ..y999999999r8   c                 B  K   t          | j                   d {V }|st          d          t          j        |          }|| j        vrI|                     |           d {V \  }}}dt          ||           }t          |          | j        |<   | j        |         S )Nz.Head node id has not yet been persisted in GCSzhttp://)	r(   r   r   r   from_hexr   _fetch_agent_infor   rO   )rW   head_node_id_hexhead_node_idip	http_port_agent_http_addresss          r9   _get_head_node_agent_oncez!JobHead._get_head_node_agent_once   s      !1$/!B!BBBBBBB 	NLMMM'788t|++%)%;%;L%I%IIIIIIIB	1!I=Y+G+G!I!I)ABT)U)UDL&|L))r8   c                   K   t          j                     |z   }d}t          j                     |k     r	 |                                  d{V S # t          $ rN}|}t                              dt
           d           t          j        t
                     d{V  Y d}~nd}~ww xY wt          j                     |k     t          d| d|           )a  Retrieves HTTP client for `JobAgent` running on the Head node. If the head
        node does not have an agent, it will retry every
        `TRY_TO_GET_AGENT_INFO_INTERVAL_SECONDS` seconds indefinitely.

        Args:
            timeout_s: The timeout for the operation.

        Returns:
            A `JobAgentSubmissionClient` for interacting with jobs via the head node's agent process.

        Raises:
            TimeoutError: If the operation times out.
        Nz+Failed to get head node agent, retrying in z seconds...z%Failed to get head node agent within z  seconds. The last exception is )	timer   r   rg   	exceptionr   asynciosleepTimeoutError)rW   r   timeout_pointr   es        r9   r   zJobHead._get_head_node_agent  s      	i/	ikkM))L!;;========= L L L	  uBhuuu   m$JKKKKKKKKKKKKKKL ikkM)) jIjj_hjj
 
 	
s   A 
B%AB  B%target_node_idc                   K   t            |                                 }| j                            |t          t
                     d{V }|st          d| d          t          j        |	                                          S )z
        Fetches agent info by the Node ID. May raise exception if there's network error or the
        agent info is not found.

        Returns: (ip, http_port, grpc_port)
        )	namespacetimeoutNz-Agent info not found in internal KV for node z. It's possible that the agent didn't launch successfully due to port conflicts or other issues. Please check `dashboard_agent.log` for more details.)
r   hexr   async_internal_kv_getr   r   KeyErrorre   loadsdecode)rW   r   keyvalues       r9   r   zJobHead._fetch_agent_info"  s       5Ln6H6H6J6JLLo;;,+ < 
 
 
 
 
 
 
 

  	$ $ $ $   z%,,..)))r8   z/api/versionra   c                    K   t          t          t          j        t          j        | j                  }t          t          j        t          j
        |                    dt          j        j        j                  S )N)versionray_version
ray_commitsession_nameapplication/jsonr]   content_typer\   )r+   r*   r   __version__
__commit__r   r
   re   dumpsrk   rl   rT   webHTTPOkstatus_code)rW   ra   rY   s      r9   get_versionzJobHead.get_version8  sn       #~*	
 
 
 K.t4455+;%1
 
 
 	
r8   z'/api/packages/{protocol}/{package_name}c                   K   t          |j        d         |j        d                   }t                              d| d           	 t	          |           nF# t
          $ r9 t          t          j                    t          j
        j        j                  cY S w xY wt          |          s)t          d| dt          j
        j        j                  S t                      S )	Nprotocolpackage_namer   r   z&Adding temporary reference to package r[   r]   r\   zPackage  does not exist)r#   
match_inforg   rh   r   r   r
   	traceback
format_excrT   r   HTTPInternalServerErrorr   r   HTTPNotFound)rW   ra   package_uris      r9   get_packagezJobHead.get_packageH  s     0^J/7
 
 

 	LkLLLMMM	,,,, 	 	 	)++{:F     	 k** 	<<<<{/;   
 zzs   	A A BBc                   K   t          |j        d         |j        d                   }t                              d| d           	 |                                 d {V }t                                          d t          ||           d {V  nF# t          $ r9 t          t          j                    t          j        j        j                  cY S w xY wt          t          j        j        j                  S )Nr   r   r   zUploading package z to the GCS.r   )r\   )r#   r   rg   inforeadr   run_in_executorr   r   r
   r   r   rT   r   r   r   r   )rW   ra   r   r   s       r9   upload_packagezJobHead.upload_package`  s/     0^J/7
 
 
 	BBBBCCC	######D*,,<<%	           	 	 	)++{:F     	 w{1=>>>>s   	A	B A CCz
/api/jobs/c                   K   t          |t                     d {V }t          |t                    r|S |}	 |                                  d {V }|                    |           d {V }n# t          j        $ r( t          dt          j	        j
        j                  cY S t          t          f$ r9 t          t          j                    t          j	        j        j                  cY S t"          $ r9 t          t          j                    t          j	        j
        j                  cY S w xY wt          t%          j        t)          j        |                    dt          j	        j        j                  S )Nz9No available agent to submit job, please try again later.r   r   r   )r)   r!   
isinstancer
   r   rn   r   r   rT   r   r   r   	TypeErrorrC   r   r   HTTPBadRequestr   re   r   rk   rl   r   )rW   ra   resultsubmit_requestjob_agent_clientrY   s         r9   
submit_jobzJobHead.submit_jobw  s     1#7GHHHHHHHHfh'' 	6M/5N	%)%:%:%<%<<<<<<<)==nMMMMMMMMDD# 	 	 	P{:F      :& 	 	 	)++{1=       	 	 	)++{:F     	 K.t4455+;%1
 
 
 	
s   5A. .4D.$AD.,?D.-D.z%/api/jobs/{job_or_submission_id}/stopc                   K   |j         d         }t          | j        | j        |           d {V }|s)t	          d| dt
          j        j        j                  S |j	        t          j        ur%t	          dt
          j        j        j                  S 	 |                                  d {V }|                    |j                   d {V }nF# t           $ r9 t	          t#          j                    t
          j        j        j                  cY S w xY wt	          t)          j        t-          j        |                    d          S )Njob_or_submission_idJob r   r   z"Can only stop submission type jobsr   r]   r   )r   r&   r   r   r
   rT   r   r   r   r|   r%   
SUBMISSIONr   r   rr   ri   r   r   r   r   re   r   rk   rl   rW   ra   r   jobr   rY   s         r9   stop_jobzJobHead.stop_job  s     "~.DE#O! 
 
 
 
 
 
 
 

  	A0AAA{/;    87---9{1=   
	%)%:%:%<%<<<<<<<);;C<MNNNNNNNNDD 	 	 	)++{:F     	 K.t4455DV
 
 
 	
   :C A DDz /api/jobs/{job_or_submission_id}c                   K   |j         d         }t          | j        | j        |           d {V }|s)t	          d| dt
          j        j        j                  S |j	        t          j        ur%t	          dt
          j        j        j                  S 	 |                                  d {V }|                    |j                   d {V }nF# t           $ r9 t	          t#          j                    t
          j        j        j                  cY S w xY wt	          t)          j        t-          j        |                    d          S )Nr   r   r   r   z$Can only delete submission type jobsr   r   )r   r&   r   r   r
   rT   r   r   r   r|   r%   r   r   r   ru   ri   r   r   r   r   re   r   rk   rl   r   s         r9   
delete_jobzJobHead.delete_job  s     "~.DE#O! 
 
 
 
 
 
 
 

  	A0AAA{/;    87---;{1=   
	%)%:%:%<%<<<<<<<)==c>OPPPPPPPPDD 	 	 	)++{:F     	 K.t4455DV
 
 
 	
r   c                 "  K   |j         d         }t          | j        | j        |           d {V }|s)t	          d| dt
          j        j        j                  S t	          t          j
        |                                          d          S )Nr   r   r   r   r   r   )r   r&   r   r   r
   rT   r   r   r   re   r   r   )rW   ra   r   r   s       r9   get_job_infozJobHead.get_job_info  s      "~.DE#O! 
 
 
 
 
 
 
 

  	A0AAA{/;   
 CHHJJ''+
 
 
 	
r8   c                 v  K   t          j        t          | j                  | j                                                   d {V \  \  }}fd|                                D             }t          t          j	        g d |D             d |
                                D                       d          S )Nc                     g | ]e\  }}t          di t          j        |          ||v r                    |          j        nd                     |          t
          j        dfS )N)ri   ro   driver_infor|   r7   )r$   rk   rl   rw   idr%   r   ).0ri   r   submission_job_driverss      r9   
<listcomp>z%JobHead.list_jobs.<locals>.<listcomp>  s     
 
 
 #s   $S))+ $::: .11-@@CC266}EE'   
 
 
r8   c                 6    g | ]}|                                 S r7   r   )r   submission_jobs     r9   r   z%JobHead.list_jobs.<locals>.<listcomp>  s$    RRRn))++RRRr8   c                 6    g | ]}|                                 S r7   r   )r   job_infos     r9   r   z%JobHead.list_jobs.<locals>.<listcomp>  s     KKK(hmmooKKKr8   r   r   )r   gatherr'   r   r   get_all_jobsitemsr
   re   r   rF   )rW   ra   driver_jobssubmission_jobsr   s       @r9   	list_jobszJobHead.list_jobs  s     GN~DO,,d.C.P.P.R.RH
 H
 B
 B
 B
 B
 B
 B
>-,
 
 
 
 '6&;&;&=&=
 
 
 RR/RRRKKk6H6H6J6JKKK  ,
 
 
 	
r8   z%/api/jobs/{job_or_submission_id}/logsc                   K   |j         d         }t          | j        | j        |           d {V }|s)t	          d| dt
          j        j        j                  S |j	        t          j        ur%t	          dt
          j        j        j                  S 	 |                     |          }|r |                    |j                   d {V nt!          d          }t	          t#          j        t'          j        |                    d          S # t*          $ r9 t	          t-          j                    t
          j        j        j                  cY S w xY w)	Nr   r   r   r   )Can only get logs of submission type jobs r   r   )r   r&   r   r   r
   rT   r   r   r   r|   r%   r   r   get_job_driver_agent_clientrx   ri   r   re   r   rk   rl   r   r   r   r   )rW   ra   r   r   r   payloads         r9   get_job_logszJobHead.get_job_logs  s     "~.DE#O! 
 
 
 
 
 
 
 

  	A0AAA{/;   
 87---@{1=   
	#??DD $)&<<S=NOOOOOOOOO$R(( 
 Z 27 ; ;<</     	 	 	)++{:F     	s   A:D A EEz*/api/jobs/{job_or_submission_id}/logs/tail)	resp_typec                   K   |j         d         }t          | j        | j        |           d {V }|s)t	          d| dt
          j        j        j                  S |j	        t          j        ur%t	          dt
          j        j        j                  S t
          j                                        }|                    |           d {V  d }|ht          | j        | j        |           d {V }|j        }|j        }|                                r||S t%          j        | j                   d {V  |h|                     |          }|                    |j                  2 3 d {V }|                    |           d {V  #6 |S )Nr   r   r   r   r  )r   r&   r   r   r
   rT   r   r   r   r|   r%   r   r   WebSocketResponsepreparedriver_agent_http_addressr\   is_terminalr   r   $WAIT_FOR_SUPERVISOR_ACTOR_INTERVAL_Sr  r   ri   send_str)	rW   ra   r   r   r   r
  r\   r   liness	            r9   r   zJobHead.tail_job_logs0  s"       #~.DE#O! 
 
 
 
 
 
 
 

  	A0AAA{/;   
 87---@{1=   
 [**,,jjoo$(!'/'%$       C
 ),(E%ZF!!## (A(I	- IJJJJJJJJJ (/  ;;C@@+99#:KLL 	% 	% 	% 	% 	% 	% 	%%++e$$$$$$$$$$ M 	s   (Fr   c                     |j         d S |j        }|| j        vrt          |j                   | j        |<   | j        |         S rR   )r
  driver_node_idr   rO   )rW   r   r  s      r9   r  z#JobHead.get_job_driver_agent_client_  sR     (04+--+C-, ,DL( |N++r8   z/api/component_activitiesc           	        K   |j                             dd           }|r$|                                rt          |          }nd}|                     |           d {V }dt          |          i}t          t          j        v r	 t          t          j        t                             } |            }t          |t
                    s%J dt          j        t                    d|             |D ]}	 ||         }t          di t          |          }t          |          ||<   7# t          $ r}	t                              d| dt          j        t                    d	           t          j        t#          |	          t%          j                                                    d
||<   Y d }	~	d }	~	ww xY wn# t          $ r}	t                              dt          j        t                    d	           t          j        t#          |	          t%          j                                                    d
|d<   Y d }	~	nd }	~	ww xY wt*          j                            t1          j        |          dt*          j        j        j                  S )Nr      )r   driverzOutput of hook z7 should be Dict[str, RayActivityResponse]. Got output: z!Failed to get activity status of z from user hook r[   r=   r>   r?   z-Failed to get activity status from user hook external_componentr   r   r7   )queryrw   isdigitint_get_job_activity_infor   r   osenvironr   r   r;   r   rg   r   r0   r3   reprr   nowr?   rT   r   r
   re   r   r   r   )
rW   ra   r   driver_activity_inforY   cluster_activity_callableexternal_activity_outputcomponent_typecomponent_activity_outputr   s
             r9   get_component_activitiesz JobHead.get_component_activitiesm  s      )--	400 	w(( 	'llGGG &*%@%@%@%Q%QQQQQQQ$3445$
22',6J89- -) ,E+D+F+F(!":DAA  :bj1J&K : :7: : A
 '?  N4L*51 5H 5 5"#<==5 51 044M/N/N^,,$ 	 	 	((W W W.0j9R.SW W W  
 *;)@&*1gg)1)A)A)C)C0 0^,,,,,,	(  	 	 	  EJ'@AE E E  
 "3!8"1gg!)!9!9!;!;. .)******	 {##D!!+;%1 $ 
 
 	
sE   A,F: 53D)(F: )
F63A9F1,F: 1F66F: :
IA6H??Ir   c                 6  K   	 | j                             dd|           d {V }d}d}|                                D ]\}t          |j                  }|j        j                            d          }|j        rt          ||j                  n|}|s|s|dz  }]t          j                                                    }||k    r|dz  }||k    sJ d| d|             |dk    rt          j        nt          j        }	t!          |	|rd	| nd ||r|nd 
          S # t"          $ rp}
t$                              d           t!          t          j        t+          |
          t          j                                                              cY d }
~
S d }
~
ww xY w)NT)skip_submission_job_info_fieldskip_is_running_tasks_fieldr   r   _ray_internal_r   i  zMost recent job end time z2 must be before or equal to the current timestamp zNumber of active drivers: )r=   r>   r?   r@   z-Failed to get activity status of Ray drivers.r  )r   async_get_all_job_inforF   boolis_deadconfigray_namespace
startswithend_timemaxr   r  r?   r0   r1   r2   r;   r   rg   r   r3   r  )rW   r   replynum_active_driverslatest_job_end_timejob_table_entryr*  in_internal_namespacecurrent_timestampr=   r   s              r9   r  zJobHead._get_job_activity_info  sQ     6	/@@/3,0 A        E "#"##(<<>> , ,677(7(>(L(W(W$) )%
 '/-C+_-EFFF, $
  ,'< ,&!+& ( 8 8 : : #%666&9D&@#(,????T0C T T@QT T @?? &)) "((&/ 
 '#%H4FHHH+ 9L!U!4!4QU	 	 	 	  	 	 	LMMM&+1Aww",..2244        	s   DD 
F(A%FFFc                    K   t                                                       d {V  | j        st          | j                  | _        d S d S rR   )r   runr   r   r   )rW   r   s    r9   r7  zJobHead.run  s[      ggkkmm$ 	J$8$I$ID!!!	J 	Jr8   )/r4   r5   r6   rI   r  rX   r   rL   rO   r   r   r   r   r   rK   r  r   routesrw   r	   r
   r   r   putr   rj   r   r   rt   r   r   r   r  r.   	WEBSOCKETr   r   r$   r   r  rT   r   r#  r;   r  r7  __classcell__)r   s   @r9   r   r      s       
 
 ,-(F F F F F  ">: ::	!: : : :$*1I * * * *
E 
>V 
 
 
 
:*f *sCQT}AU * * * *, VZ
W 
 
 
 
  
 VZ9::W     ;:. VZ9::? ? ? ? ;:?, V[
G 
 
 
 
 
B V[899
' 
h 
 
 
 :9
> V]566
G 
 
 
 
 76
> VZ233
g 
( 
 
 
 43
* VZ
7 
x 
 
 
 
6 VZ788"g "( " " " 98"H VZ4@V  *w *> * * * *X,,	*	+, , , , VZ+,,;
;&;
		;
 ;
 ;
 -,;
z<C <<O < < < <|J J J J J J J J Jr8   r   )Sr   rk   enumre   loggingr  r   r   r   typingr   r   r   r   aiohttp.webrT   aiohttp.clientr   r	   r
   r   r   r   ray._common.network_utilsr   ray._common.pydantic_compatr   r   r   r   ray._common.utilsr   r   ray._private.ray_constantsr   "ray._private.runtime_env.packagingr   r   r   ray.dashboard.constsr   r   r   r   r    ray.dashboard.modules.job.commonr   r   r   r    r!   r"   r#   )ray.dashboard.modules.job.pydantic_modelsr$   r%   ray.dashboard.modules.job.utilsr&   r'   r(   r)   ray.dashboard.modules.versionr*   r+   !ray.dashboard.subprocesses.moduler,   !ray.dashboard.subprocesses.routesr-   r8   ray.dashboard.subprocesses.utilsr.   	getLoggerr4   rg   setLevelINFOrK   Enumr0   allowr;   rO   r   r7   r8   r9   <module>rS     s           				            7 7 7 7 7 7 7 7 7 7 7 7     ) ) ) ) ) ) 9 9 9 9 9 9 9 9 9 9 



       3 3 3 3 3 3 J J J J J J J J J J J J B B B B B B B B = = = = = =         
                               J I I I I I I I            K J J J J J J J > > > > > > L L L L L L 9 9 9 9 9 9		8	$	$        TY   ' ' ' ' ')5; ' ' ' 'TU U U U U U U UpiJ iJ iJ iJ iJ iJ iJ iJ iJ iJr8   