o
    $i5?                     @   s8  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 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% 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Z0			d$dee1 dee1 dee1 fddZ2e j3G dd dZ4ddddddde1dee5 deee1e
f  deee1e
f  deee1e
f  dee5 de4fddZ6					d%dee1 de5deee1e
f  deee1e
f  deee1e
f  de4fd d!Z7G d"d# d#Z8dS )&    N)Path)AnyDictListOptionalUnion) format_authentication_http_error get_auth_headers_if_auth_enabled)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)AuthenticationError)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"   `/home/ubuntu/veenaModal/venv/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%   P   s
   
 r%   Fcreate_cluster_if_neededr'   r(   r)   _use_tlsr&   r0   r'   r(   r)   r1   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&   r0   r'   r(   r)   r1   schemer"   r"   r#   &get_job_submission_client_cluster_infoY   s   r7   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'.r5   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 >   r4   r3   r3   r/   zModule: z6 does not exist.
This module was parsed from address: r7   z^ does not have `get_job_submission_client_cluster_info`.
This module was parsed from address: )r0   r'   r(   r)   )r;   is_initialized_privateworkerglobal_workernodeaddress_infologgerinfoDEFAULT_DASHBOARD_ADDRESSr   r   r7   	importlibimport_module	ExceptionRuntimeErrordir)r&   r0   r'   r(   r)   module_stringinner_addressmoduler"   r"   r#   parse_cluster_info   sz   



rM   c                   @   s  e Zd Z						d8d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		d9dedefddZ
			d:d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d&ee d'eee  d(edefd)d*Z			d<d$e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d0d1Zed2d3defd4d5Zedefd6d7ZdS )=SubmissionClientNFTr&   r0   r'   r(   r)   verifyc           
      C   s  |d ur| dr|d}td| d t|||||}|j| _|j| _|j	p+i | _
|jp1i | _| jjdi t| j || _t| jtrwtj| jrVd | j}}	ntj| jrd| jd }}	n	td| j dtj||	d| _d S | jdu rd| _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capathFr"   )endswithrstriprB   debugrM   r&   _addressr'   _cookiesr(   _default_metadatar)   _headersupdater	   _verify
isinstancer-   ospathisdirisfileFileNotFoundErrorsslcreate_default_context_ssl_context)
selfr&   r0   r'   r(   r)   rO   cluster_inforQ   rR   r"   r"   r#   __init__   s8   





zSubmissionClient.__init__1.9min_versionversion_error_messagec                 C   s   |  || d S N)&_check_connection_and_version_with_url)re   ri   rj   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: r9   )_do_requeststatus_coderH   raise_for_statusr   	packagingversionparserequests
exceptionsConnectionErrorrV   )re   ri   rj   ro   r   running_ray_versionr"   r"   r#   rl     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: r9   )rH   rt   textre   r   r"   r"   r#   _raise_error!  s   zSubmissionClient._raise_error)data	json_datamethodendpointr   r   r2   c          	      K   sj   | j | }td| d|pi  d tj||f| j||| j| jd|}t|j	|j
}|r3t||S )zPerform the actual HTTP request with authentication error handling.

        Keyword arguments other than "cookies", "headers" are forwarded to the
        `requests.request()`.
        zSending request to z with json data: r9   )r'   r   r   r)   rO   )rV   rB   rU   ry   requestrW   rY   r[   r   rt   r~   r   )	re   r   r   r   r   kwargsro   responseformatted_errorr"   r"   r#   rs   &  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 )Nrp   /api/packages/rP      Package z already exists.Trq   z does not exist.F)r   rs   rt   rB   rU   r   )re   r   protocolpackage_namer   r"   r"   r#   _package_existsK  s   

z SubmissionClient._package_existspackage_pathinclude_gitignoreinclude_parent_direxcludesis_filec              	   C   s   t d| d t P}t|\}}	|rt|}
nt||	 }
t||
|||d z"| jdd| d|	 |
 d}|j	dkrE| 
| W |sL|
  n|sT|
  w w W d    d S 1 s`w   Y  d S )	NzUploading package r9   )r   r   r   PUTr   rP   )r   r   )rB   rC   tempfileTemporaryDirectoryr   r   r
   rs   
read_bytesrt   r   unlink)re   r   r   r   r   r   r   tmp_dirr   r   package_filer   r"   r"   r#   _upload_package[  s<   	




"z SubmissionClient._upload_packagec                 C   sZ   |r	t t|}nt|||d}| |s"| j||||||d |S td| d |S )N)r   r   r   r   r   r   z! already exists, skipping upload.)r   r   r   r   r   rB   rC   )re   r   r   r   r   r   r   r"   r"   r#   _upload_package_if_needed  s"   
z*SubmissionClient._upload_package_if_neededr   c                    @   ddl m} tj|ddk d	 fdd	}t| |d d S )
Nr    RAY_RUNTIME_ENV_IGNORE_GITIGNORE01Fc                       j |  d||d d S )NFr   r   )r   r   r   r   re   r"   r#   
_upload_fn     
zBSubmissionClient._upload_working_dir_if_needed.<locals>._upload_fnr   	upload_fnF)ray._private.ray_constantsr   r]   environgetr   re   r   r   r   r"   r   r#   _upload_working_dir_if_needed     	
z.SubmissionClient._upload_working_dir_if_neededc                    r   )
Nr   r   r   r   Fc                    r   )NTr   r   )module_pathr   r   r   r"   r#   r     r   zASubmissionClient._upload_py_modules_if_needed.<locals>._upload_fnr   r   )r   r   r]   r   r   r   r   r"   r   r#   _upload_py_modules_if_needed  r   z-SubmissionClient._upload_py_modules_if_neededbeta)	stabilityc                 C   s2   |  dd}|jdkr| dS | | d S )Nrp   rn   r   rw   )rs   rt   r   r   r   r   r"   r"   r#   get_version  s   
zSubmissionClient.get_versionc                 C   s   | j S rk   )rV   )re   r"   r"   r#   get_address  s   zSubmissionClient.get_address)NFNNNT)rh   N)rh   Nrn   )r   r}   )FNF)r*   r+   r,   r   r-   boolr   r   r   rg   rm   rl   r   bytesdictrs   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   rN      s    
0


 

%


(

rN   )NNN)NFNNN)9dataclassesrE   r   loggingr]   rb   r   pathlibr   typingr   r   r   r   r   packaging.versionrv   r   r;   5ray._private.authentication.http_token_authenticationr   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.exceptionsr   ray.util.annotationsr   r   ry   ImportError	getLoggerr*   rB   setLevelINFOrD   r-   r$   	dataclassr%   r   r7   rM   rN   r"   r"   r"   r#   <module>   s    

#	

(
L