o
    $i1                     @   s   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 d dlZd dl	m
Z
mZ d dlZd dlm  m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 eeZe ej! d
d Z"G dd deZ#dS )    Nwraps)Optional)RequestResponse)ValidationError)CURRENT_VERSIONVersionResponse)SubprocessModule)SubprocessRouteTable)RayTaskErrorc                  C   s   dd } | S )Nc                    s   t   fdd}|S )Nc                    sN   zddl m} W n ty   tddd Y S w  | g|R i |I d H S )Nr   servei  zLServe dependencies are not installed. Please run `pip install "ray[serve]"`.statustext)rayr   ImportErrorr   )selfargskwargsr   func c/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/ray/dashboard/modules/serve/serve_head.pycheck   s   
z3validate_endpoint.<locals>.decorator.<locals>.checkr   )r   r   r   r   r   	decorator   s   z$validate_endpoint.<locals>.decoratorr   )r   r   r   r   validate_endpoint   s   r   c                       s   e Zd Z fddZeddedefddZede	
 e dedefd	d
Zede	
 dedefddZede	
 e dedefddZdedefddZede	
 e dedefddZdd Zdd Z  ZS )	ServeHeadc                    sN   t  j|i | d | _t | _t | _| jd usJ tj	j
 s%J d S )N)super__init___controllerasyncioLock_controller_lock_controller_start_lock
gcs_clientr   experimentalinternal_kv_internal_kv_initialized)r   r   r   	__class__r   r   r    0   s   

zServeHead.__init__z/api/ray/versionreqreturnc                    s8   t ttjtj| jd}ttt	
|dtjjjdS )N)versionray_version
ray_commitsession_nameapplication/json)r   content_typer   )r	   r   r   __version__
__commit__r1   r   jsondumpsdataclassesasdictaiohttpwebHTTPOkstatus_code)r   r,   respr   r   r   get_versionA   s   zServeHead.get_versionz/api/serve/applications/c              
      s   ddl m}m} d }|jd}|r3| }| }||vr/tdd| dd| dd	S ||}| 	 I d H }|d u rC|
 }	n*z|jj|d
I d H }	W n tjjyl }
 ztdd|
 dW  Y d }
~
S d }
~
ww tt|	ddS )Nr   )APITypeServeInstanceDetailsapi_type  zInvalid 'api_type' value: 'z'. Must be one of: z, z
text/plainr   r   r3   )source  zWFailed to get a response from the controller. The GCS may be down, please retry later: r   r2   )r   r3   )ray.serve.schemar@   rA   querygetlowerget_valid_user_valuesr   joinget_serve_controllerget_empty_schema_dictget_serve_instance_detailsremoter   
exceptionsr   r6   r7   )r   r,   r@   rA   rB   api_type_strapi_type_lowervalid_values
controllerdetailser   r   r   rO   Q   sH   	
z$ServeHead.get_serve_instance_detailsc                    s.   ddl m} |  I d H d ur|  t S )Nr   r   )r   r   rM   shutdownr   )r   r,   r   r   r   r   delete_serve_applications   s
   z#ServeHead.delete_serve_applicationsc              
      sz  ddl m}m} ddlm} ddlm} ddlm} z|	|
 I d H }W n tyA } ztdt|dW  Y d }~S d }~ww |j }	||j}
td|
ifi |	}|j }| j4 I d H  ||||jd	I d H }W d   I d H  n1 I d H sw   Y  | || z|jr||j || ||jd
 W t S  ty } ztdt|dW  Y d }~S d }~ww )Nr   )TagKeyrecord_extra_usage_tag)serve_start_async)ProxyLocation)ServeDeploySchemarC   r   location)http_optionsgrpc_optionsglobal_logging_configv2)ray._common.usage.usage_librZ   r[   ray.serve._private.apir\   ray.serve.configr]   rG   r^   	parse_objr6   r   r   reprr`   dict_to_deployment_modeproxy_locationra   r%   logging_configvalidate_http_optionsupdate_global_logging_configdeploy_appsSERVE_REST_API_VERSIONr   str)r   r,   rZ   r[   r\   r]   r^   configrW   config_http_optionsr_   full_http_optionsra   clientr   r   r   put_all_applications   sN   

(

zServeHead.put_all_applicationsr   c                 C   s   t |t|ddS )z6Create a JSON response with the given data and status.r2   rD   )r   r6   r7   )r   datar   r   r   r   _create_json_response   s
   zServeHead._create_json_responsezK/api/v1/applications/{application_name}/deployments/{deployment_name}/scalec              
      s  ddl m} ddlm}m} ddlm} |jd}|jd}|r%|s-| 	ddid	S z|
 I d H }|di |}	W n ty\ }
 z| 	dd
t|
 id	W  Y d }
~
S d }
~
ww |  I d H }|d u rp| 	ddidS z*|||d}td| d| d|	j d |j||	jI d H  | 	ddidW S  ty }
 zXt|
|r| 	ddidW  Y d }
~
S t|
|r| 	dt|
jidW  Y d }
~
S t|
trdt|
v r| 	ddid	W  Y d }
~
S td|
  | 	ddidW  Y d }
~
S d }
~
ww )Nr   )DeploymentID)DeploymentIsBeingDeletedErrorExternalScalerDisabledError)ScaleDeploymentRequestapplication_namedeployment_nameerrorz3Missing application_name or deployment_name in pathrC   zInvalid request body: z!Serve controller is not availablerF   )nameapp_namezScaling deployment z, application z to z	 replicasmessagezDScaling request received. Deployment will get scaled asynchronously.   zDeployment is deletedi  z	not foundz#Application or Deployment not foundz>Got an Internal Server Error while scaling deployment, error: zInternal Server Errorr   )ray.serve._private.commonry   ray.serve._private.exceptionsrz   r{   rG   r|   
match_inforI   rx   r6   	Exceptionrq   rM   loggerinfotarget_num_replicasupdate_deployment_replicasrP   
isinstancecause
ValueErrorr   )r   r,   ry   rz   r{   r|   r}   r~   request_datascale_requestrW   rU   deployment_idr   r   r   scale_deployment   st   


"zServeHead.scale_deploymentc                 C   sR   g }|  D ]\}}t|j|}||kr|| q|r'td| d d S d S )NzServe is already running on this Ray cluster and it's not possible to update its HTTP options without restarting it. Following options are attempted to be updated: .)itemsgetattrhttp_configappendr   warning)r   ru   r`   divergent_http_optionsoption	new_value
prev_valuer   r   r   rm     s   
zServeHead.validate_http_optionsc                    s   | j 4 I dH k | jdur9z| jj I dH  | jW W  d  I dH  S  tjjy5   td Y nw d| _ddl	m
}m} z
tj||d| _W n tye } ztd|  W Y d}~nd}~ww | jW  d  I dH  S 1 I dH syw   Y  dS )zGets the ServeController to the this cluster's Serve app.

        return: If Serve is running on this Ray cluster, returns a client to
            the Serve controller. If Serve is not running, returns None.
        NzController is deadr   )SERVE_CONTROLLER_NAMESERVE_NAMESPACE)	namespacezhThere is no instance running on this Ray cluster. Please call `serve.start(detached=True) to start one: )r$   r!   check_aliverP   r   rQ   RayActorErrorr   r   ray.serve._private.constantsr   r   	get_actorr   debug)r   r   r   rW   r   r   r   rM   $  s4   
0zServeHead.get_serve_controller)__name__
__module____qualname__r    routesrI   r   r   r?   dashboard_optional_utilsinit_ray_and_catch_exceptionsr   rO   deleterY   putrv   intrx   postr   rm   rM   __classcell__r   r   r*   r   r   /   s0    2,Hr   )$r"   r8   r6   logging	functoolsr   typingr   r:   aiohttp.webr   r   r   ray.dashboard.optional_utils	dashboardoptional_utilsr   ray._common.pydantic_compatr   ray.dashboard.modules.versionr   r	   !ray.dashboard.subprocesses.moduler
   !ray.dashboard.subprocesses.routesr   r   ray.exceptionsr   	getLoggerr   r   setLevelINFOr   r   r   r   r   r   <module>   s&    
