o
    bi68                     @   s  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mZ d dlZd dlZd dl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 d dlmZ d d	lm Z  d d
l!m"Z"m#Z# zd dl$Z$W n e%y}   dZ$Y nw e&e'Z(e()ej* dZ+			d"dee, dee, dee, fddZ-e j.G dd dZ/ddddddde,dee0 deee,e
f  deee,e
f  deee,e
f  dee0 de/fddZ1					d#dee, de0deee,e
f  deee,e
f  deee,e
f  de/fddZ2G d d! d!Z3dS )$    N)Path)AnyDictListOptionalUnion)create_packageget_uri_for_directoryget_uri_for_packageupload_py_modules_if_neededupload_working_dir_if_needed)split_address)
cli_logger)uri_to_http_components)DeveloperAPI	PublicAPIzhttp://localhost:8265runtime_envruntime_env_jsonworking_dirc                 C   s   i }| dur)|durt dt| d}t|}W d   n1 s#w   Y  n	|dur2t|}|durCd|v r?td ||d< |S )a  
    Generates a runtime_env dictionary using `runtime_env`, `runtime_env_json`,
    and `working_dir` CLI options. Only one of `runtime_env` or
    `runtime_env_json` may be defined. `working_dir` overwrites the
    `working_dir` from any other option.
    NzAOnly one of --runtime_env and --runtime-env-json can be provided.rr   z<Overriding runtime_env working_dir with --working-dir option)
ValueErroropenyaml	safe_loadjsonloadsr   warning)r   r   r   final_runtime_envf r!   W/home/ubuntu/.local/lib/python3.10/site-packages/ray/dashboard/modules/dashboard_sdk.pyparse_runtime_env_args(   s&   
r#   c                   @   s^   e Zd ZU eed< dZeeeef  ed< dZ	eeeef  ed< dZ
eeeef  ed< dS )ClusterInfoaddressNcookiesmetadataheaders)__name__
__module____qualname__str__annotations__r&   r   r   r   r'   r(   r!   r!   r!   r"   r$   K   s
   
 r$   Fcreate_cluster_if_neededr&   r'   r(   _use_tlsr%   r/   r&   r'   r(   r0   returnc                C   s&   |rdnd}t | d|  |||dS )av  Get address, cookies, and metadata used for SubmissionClient.

    If no port is specified in `address`, the Ray dashboard default will be
    inserted.

    Args:
        address: Address without the module prefix that is passed
            to SubmissionClient.
        create_cluster_if_needed: Indicates whether the cluster
            of the address returned needs to be running. Ray doesn't
            start a cluster before interacting with jobs, but other
            implementations may do so.

    Returns:
        ClusterInfo object consisting of address, cookies, and metadata
        for SubmissionClient to use.
    httpshttp://)r%   r&   r'   r(   )r$   )r%   r/   r&   r'   r(   r0   schemer!   r!   r"   &get_job_submission_client_cluster_infoT   s   r6   c                 C   sH  | du r4t  r)t jjjjjd dur)dt jjjjjd  } td|  d ntdt	 d t	} | dkr<t
dd	| vrNtd
|  d d|  } t| \}}|dkr`t
d|  d|dv rpt||||||dkdS zt|}W n ty   td| d|  dw dt|v sJ d| d|  |j|||||dS )zICreate a cluster if needed and return its address, cookies, and metadata.N	webui_urlzhttp://z6No address provided but Ray is running; using address .z#No address provided, defaulting to autoz*Internal error: unexpected address 'auto'.r4   zPNo scheme (e.g. 'http://') or module string (e.g. 'ray://') provided in address z, defaulting to HTTP.rayz.Internal error: unexpected Ray Client address >   r3   r2   r2   r.   zModule: z6 does not exist.
This module was parsed from address: r6   z^ does not have `get_job_submission_client_cluster_info`.
This module was parsed from address: )r/   r&   r'   r(   )r:   is_initialized_privateworkerglobal_workernodeaddress_infologgerinfoDEFAULT_DASHBOARD_ADDRESSr   r   r6   	importlibimport_module	ExceptionRuntimeErrordir)r%   r/   r&   r'   r(   module_stringinner_addressmoduler!   r!   r"   parse_cluster_info{   sz   



rL   c                   @   s  e Zd Z						d7dee dedeeeef  deeeef  deeeef  d	eeeef  fd
dZ		d8dedefddZ
			d9dededefddZd:ddZddddededee dee ddf
dd Zd!edefd"d#Z			d;d!ed$ed%ee d&eee  d'edefd(d)Z			d;d$ed%ed&eee  d'edef
d*d+Zd,eeef fd-d.Zd,eeef fd/d0Zed1d2defd3d4Zedefd5d6ZdS )<SubmissionClientNFTr%   r/   r&   r'   r(   verifyc           
      C   s   |d ur| dr|d}td| d t|||||}|j| _|j| _|j	p+i | _
|j| _|| _t| jtritj| jrHd | j}}	ntj| jrV| jd }}	n	td| j dtj||	d| _d S | jdu rsd| _d S d | _d S )N/zpThe submission address cannot contain trailing slashes. Removing them from the requested submission address of "z".zPath to CA certificates: 'z', does not exist.)cafilecapathF)endswithrstriprA   debugrL   r%   _addressr&   _cookiesr'   _default_metadatar(   _headers_verify
isinstancer,   ospathisdirisfileFileNotFoundErrorsslcreate_default_context_ssl_context)
selfr%   r/   r&   r'   r(   rN   cluster_inforP   rQ   r!   r!   r"   __init__   s6   





zSubmissionClient.__init__1.9min_versionversion_error_messagec                 C   s   |  || d S N)&_check_connection_and_version_with_url)rc   rg   rh   r!   r!   r"   _check_connection_and_version   s   z.SubmissionClient._check_connection_and_version/api/versionurlc                 C   s   |d u r
d| d}z4|  d|}|jdkrtd| |  | d }tj|tj|k r<td| d| W d S  tj	j
yP   t
d	| j d
w )Nz)Please ensure the cluster is running Ray z or higher.GET  zVersion check returned 404. ray_versionzRay version z is running on the cluster. z%Failed to connect to Ray at address: r8   )_do_requeststatus_coderG   raise_for_statusr   	packagingversionparserequests
exceptionsConnectionErrorrU   )rc   rg   rh   rm   r   running_ray_versionr!   r!   r"   rj      s2   


z7SubmissionClient._check_connection_and_version_with_urlr   requests.Responsec                 C   s   t d|j d|j d)Nz Request failed with status code z: r8   )rG   rr   textrc   r   r!   r!   r"   _raise_error  s   zSubmissionClient._raise_error)data	json_datamethodendpointr   r   r1   c                K   sL   | j | }td| d|pi  d tj||f| j||| j| jd|S )zPerform the actual HTTP request

        Keyword arguments other than "cookies", "headers" are forwarded to the
        `requests.request()`.
        zSending request to z with json data: r8   )r&   r   r   r(   rN   )rU   rA   rT   rw   requestrV   rX   rY   )rc   r   r   r   r   kwargsrm   r!   r!   r"   rq     s   
zSubmissionClient._do_requestpackage_uric                 C   sr   t |\}}| dd| d| }|jdkr"td| d dS |jdkr2td| d	 d
S | | d S )Nrn   /api/packages/rO      Package z already exists.Tro   z does not exist.F)r   rq   rr   rA   rT   r~   )rc   r   protocolpackage_namer   r!   r!   r"   _package_exists:  s   

z SubmissionClient._package_existspackage_pathinclude_parent_direxcludesis_filec              	   C   s   t d| d t O}t|\}}|rt|}	nt|| }	t||	||d z"| jdd| d| |	 d}
|
j	dkrD| 
|
 W |sK|	  n|sS|	  w w W d    d S 1 s_w   Y  d S )	NzUploading package r8   )r   r   PUTr   rO   )r   r   )rA   rB   tempfileTemporaryDirectoryr   r   r   rq   
read_bytesrr   r~   unlink)rc   r   r   r   r   r   tmp_dirr   r   package_filer   r!   r!   r"   _upload_packageJ  s:   




"z SubmissionClient._upload_packagec                 C   sV   |r	t t|}nt||d}| |s | j|||||d |S td| d |S )N)r   r   r   r   r   z! already exists, skipping upload.)r
   r   r	   r   r   rA   rB   )rc   r   r   r   r   r   r!   r!   r"   _upload_package_if_neededl  s   

z*SubmissionClient._upload_package_if_neededr   c                       d fdd	}t ||d d S )NFc                        j | d||d d S )NFr   r   )r   r   r   rc   r!   r"   
_upload_fn  s   
zBSubmissionClient._upload_working_dir_if_needed.<locals>._upload_fn	upload_fnFr   rc   r   r   r!   r   r"   _upload_working_dir_if_needed  s   z.SubmissionClient._upload_working_dir_if_neededc                    r   )NFc                    r   )NTr   r   )module_pathr   r   r   r!   r"   r     s   
zASubmissionClient._upload_py_modules_if_needed.<locals>._upload_fnr   r   r   r   r!   r   r"   _upload_py_modules_if_needed  s   z-SubmissionClient._upload_py_modules_if_neededbeta)	stabilityc                 C   s2   |  dd}|jdkr| dS | | d S )Nrn   rl   r   ru   )rq   rr   r   getr~   r}   r!   r!   r"   get_version  s   
zSubmissionClient.get_versionc                 C   s   | j S ri   )rU   r   r!   r!   r"   get_address  s   zSubmissionClient.get_address)NFNNNT)rf   N)rf   Nrl   )r   r{   )FNF)r)   r*   r+   r   r,   boolr   r   r   re   rk   rj   r~   bytesdictrq   r   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   rM      s    
.


 




%

rM   )NNN)NFNNN)4dataclassesrD   r   loggingr[   r`   r   pathlibr   typingr   r   r   r   r   packaging.versionrt   r   r:   "ray._private.runtime_env.packagingr   r	   r
   #ray._private.runtime_env.py_modulesr   $ray._private.runtime_env.working_dirr   ray._private.utilsr   "ray.autoscaler._private.cli_loggerr    ray.dashboard.modules.job.commonr   ray.util.annotationsr   r   rw   ImportError	getLoggerr)   rA   setLevelINFOrC   r,   r#   	dataclassr$   r   r6   rL   rM   r!   r!   r!   r"   <module>   s    

#	

(
L