o
    cie                     @   s  d dl Z d dlmZmZmZ d dlmZ d dlmZm	Z	m
Z
mZmZm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mZmZ d d	lmZ d d
lm Z  dZ!eddG dd dZ"e ddeddG dd dZ#e$Z%e&Z'e$Z(eG dd dZ)G dd de$eZ*G dd de$eZG dd de$eZG dd de$eZ+ej,fd ej-fdej.fdej/ej0fdej1ej0fdej/ej2fd ej1ej2fd ej3fd iZ4edd!G d"d# d#ZeddG d$d% d%Z5eddG d&d' d'Z6G d(d) d)e$eZ7G d*d+ d+e$eZ8eG d,d- d-Z9eG d.d/ d/Z:G d0d1 d1e$eZ;G d2d3 d3e$eZ<eG d4d5 d5Z=G d6d7 d7Z>G d8d9 d9e$eZ?eddG d:d; d;Z@eddG d<d= d=ZAdS )>    N)asdict	dataclassfield)Enum)Any	AwaitableCallableDictListOptional)Scope)ActorHandle)SERVE_DEFAULT_APP_NAMESERVE_NAMESPACE)DeploymentStatusDeploymentStatusInfoDeploymentStatusTrigger)RayServegRPCContext)	PublicAPIzSERVE_REPLICA::T)frozenc                   @   s:   e Zd ZU eed< eZeed< dd Zdd Zdd Z	d	S )
DeploymentIDnameapp_namec                 C   s   d| j  d| j S )NzServeReplica::)r   r   self r   M/home/ubuntu/.local/lib/python3.10/site-packages/ray/serve/_private/common.pyto_replica_actor_class_name   s   z(DeploymentID.to_replica_actor_class_namec                 C   s   d| j  d| j dS )NzDeployment(name='', app='')r   r   r   r   r   r   __str__   s   zDeploymentID.__str__c                 C      t | S Nstrr   r   r   r   __repr__!      zDeploymentID.__repr__N)
__name__
__module____qualname__r&   __annotations__r   r   r   r"   r'   r   r   r   r   r      s   
 r   alpha)	stabilityc                   @   sx   e Zd ZU dZeed< 	 eed< 	 defddZedede	fdd	Z
edefd
dZdefddZdefddZdS )	ReplicaIDz"A unique identifier for a replica.	unique_iddeployment_idreturnc                 C   s:   | j j d| j }| j jr| j j d| }t | S )N#)r1   r   r0   r   REPLICA_ID_FULL_ID_STR_PREFIX)r   sr   r   r   to_full_id_str0   s   zReplicaID.to_full_id_strr5   c                 C   s
   |  tS r$   )
startswithr4   )r5   r   r   r   is_full_id_str7   s   
zReplicaID.is_full_id_strc                 C   sz   |  |sJ |ttd  d}t|dkr|\}}}nt|dkr+d}|\}}ntd| d| |t||ddS )	Nr3          zGiven replica ID string z\ didn't match expected pattern, ensure it has either two or three fields with delimiter '#'.r!   )r1   )r8   lenr4   split
ValueErrorr   )clsr5   parsedr   deployment_namer0   r   r   r   from_full_id_str;   s   


zReplicaID.from_full_id_strc                 C   r#   r$   r%   r   r   r   r   r'   P   r(   zReplicaID.__repr__c                 C   s"   d| j  d| jj d| jj dS )z{Returns a human-readable string.

        This is used in user-facing log messages, so take care when updating it.
        zReplica(id='z', deployment='r   r    )r0   r1   r   r   r   r   r   r   r"   S   s   zReplicaID.__str__N)r)   r*   r+   __doc__r&   r,   r   r6   staticmethodboolr8   classmethodrB   r'   r"   r   r   r   r   r/   %   s   
 r/   c                   @   s"   e Zd ZU eed< dZeed< dS )EndpointInforouteFapp_is_cross_languageN)r)   r*   r+   r&   r,   rI   rE   r   r   r   r   rG   f      
 rG   c                   @   $   e Zd ZdZdZdZdZdZdZdS )ReplicaStateSTARTINGUPDATING
RECOVERINGRUNNINGSTOPPINGPENDING_MIGRATIONN)	r)   r*   r+   rM   rN   rO   rP   rQ   rR   r   r   r   r   rL   m       rL   c                   @   rK   )r   rN   HEALTHY	UNHEALTHYDEPLOY_FAILED	UPSCALINGDOWNSCALINGN)	r)   r*   r+   rN   rT   rU   rV   rW   rX   r   r   r   r   r   v   rS   r   c                   @   4   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdS )r   UNSPECIFIEDCONFIG_UPDATE_STARTEDCONFIG_UPDATE_COMPLETEDUPSCALE_COMPLETEDDOWNSCALE_COMPLETEDAUTOSCALINGREPLICA_STARTUP_FAILEDHEALTH_CHECK_FAILEDINTERNAL_ERRORDELETINGN)r)   r*   r+   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   r   r   r   r   r          r   c                   @   rY   )DeploymentStatusInternalTriggerrT   CONFIG_UPDATEAUTOSCALE_UPAUTOSCALE_DOWNMANUALLY_INCREASE_NUM_REPLICASMANUALLY_DECREASE_NUM_REPLICASr`   ra   rb   DELETEN)r)   r*   r+   rT   rf   rg   rh   ri   rj   r`   ra   rb   rk   r   r   r   r   re      rd   re      r:   r9   )eqc                   @   s   e Zd ZU eed< eed< eed< dZeed< ede	fddZ
d	d
 Z			ddededefddZdefddZ	ddededd fddZdd ZedefddZdS )r   r   statusstatus_triggerr;   messager2   c                 C   s<   | j ftv rt| j f S | j | jftv rt| j | jf S dS )zGet priority of state based on ranking_order().

        The ranked order indicates what the status should be of a
        hierarchically "higher" resource when derived from a group of
        `DeploymentStatusInfo` sub-resources.
        N)rn   DEPLOYMENT_STATUS_RANKING_ORDERro   r   r   r   r   rank   s
   	zDeploymentStatusInfo.rankc                 C   s   t jt| ddS )N   )indent)jsondumpsr   r   r   r   r   debug_string   s   z!DeploymentStatusInfo.debug_stringNc                 C   s,   t | j|r|n| j|r||dS | j|dS )zGReturns a copy of the current object with the passed in kwargs updated.r   rn   ro   rp   )r   r   rn   ro   )r   rn   ro   rp   r   r   r   _updated_copy   s   z"DeploymentStatusInfo._updated_copyc                 C   s   | j |dS )N)rp   )ry   )r   rp   r   r   r   update_message   s   z#DeploymentStatusInfo.update_messagetriggerc                 C   s>  |t jkr| jtjtj|dS |t jkr| jtjtj|dS | j	tjkr|t j
kr3| jtj
tj|dS |t jkrB| jtjtj|dS |t jkrQ| jtjtj|dS |t jkr`| jtjtj|dS |t jt jhv rj| S |t jkry| jtjtj|dS |t jkr| jtjtj|dS | S | j	tjtjhv r|t j
kr| jtj
| j	tjkrtj|dS tj|dS |t jkr| jtjtj|dS | jtjkr|t jks| jtjkr|t jkr| jtj|dS | jtjkr|t jks| jtjkr|t jkr| jtj|dS |t jkr
| jtjtj|dS |t jkr| jtjtj|dS | S | j	tj
kr|t j
kr+| S |t jkr;| jtjtj|dS |t jkrK| jtjtj|dS |t jkr[| jtjtj|dS |t jkrk| jtjtj|dS |t jkr{| jtjtj|dS |t jkr| jtjtj|dS | S | j	tjkr|t j
kr| jtj
tj|dS |t jkr| jtjtj|dS |t jkr| jtjtj|dS |t jkr| jtjtj|dS | S | j	tjkr|t j
kr| jtj
tj|dS |t jkr| jtjtj|dS |t jkr| jtjtj|dS |t jkr| jtjtj|dS | S )aj  Handles a transition from the current state to the next state.

        Args:
            trigger: An internal trigger that determines the state
                transition.
            message: The message to set in status info.

        Returns:
            New instance of DeploymentStatusInfo representing the
            next state to transition to.
        )rn   ro   rp   )rn   rp   )re   rb   ry   r   rU   r   rk   rN   rc   rn   rT   r\   rf   r[   rg   rW   r_   rh   rX   ri   rj   ra   rV   r`   r]   r^   ro   rZ   )r   r{   rp   r   r   r   handle_transition   s  







 6 

	

zE&z&DeploymentStatusInfo.handle_transitionc                 C   s(   t | jd| jj d| jj | jdS NDEPLOYMENT_STATUS_DEPLOYMENT_STATUS_TRIGGER_rx   )DeploymentStatusInfoProtor   rn   ro   rp   r   r   r   r   to_proto  s   zDeploymentStatusInfo.to_protoprotoc                 C   sL   t |jtdd  }t|jtdd  }| |jt|t||j	dS r}   )
DeploymentStatusProtoNamern   r<   DeploymentStatusTriggerProtoro   r   r   r   rp   )r?   r   rn   ro   r   r   r   
from_proto  s   

zDeploymentStatusInfo.from_proto)NNr;   )r;   )r)   r*   r+   r&   r,   r   r   rp   propertyintrr   rw   ry   rz   re   r|   r   rF   r   r   r   r   r   r   r      s@   
 

  r   c                   @   s   e Zd ZU eed< ee ed< ee ed< ee ed< eed< eed< dZ	e
ed< eed	Zee ed
< eed	Zeeef ed< dZee ed< dd Zdd Zdd ZdS )RunningReplicaInfo
replica_idnode_idnode_ipavailability_zoneactor_handlemax_ongoing_requestsFis_cross_language)default_factorymultiplexed_model_idsrouting_statsNportc                 C   s`   t d| j | jr| jndt| jjt| jt| j	t| j
t| jg}t| d| d S )N r;   _hash)hashjoinr   r6   r   r&   r   	_actor_idr   r   r   r   object__setattr__)r   hash_valr   r   r   __post_init__  s   
z RunningReplicaInfo.__post_init__c                 C      | j S r$   )r   r   r   r   r   __hash__%  s   zRunningReplicaInfo.__hash__c                 C   s   t t|t| j|jkgS r$   )all
isinstancer   r   )r   otherr   r   r   __eq__(  s
   
zRunningReplicaInfo.__eq__)r)   r*   r+   r/   r,   r   r&   r   r   r   rE   r   listr   r
   dictr   r	   r   r   r   r   r   r   r   r   r   r     s   
 r   c                   @   s"   e Zd ZU eed< ee ed< dS )DeploymentTargetInfois_availablerunning_replicasN)r)   r*   r+   rE   r,   r
   r   r   r   r   r   r   1  rJ   r   c                   @      e Zd ZdZdS )ServeDeployMode	MULTI_APPN)r)   r*   r+   r   r   r   r   r   r   7      r   c                   @   r   )ServeComponentTypereplicaN)r)   r*   r+   REPLICAr   r   r   r   r   ;  r   r   c                   @   sF   e Zd ZU dZeed< dZeee	  ed< dZ
eee	ef  ed< dS )RequestRoutingInfozInformation about the request routing.

    It includes deployment name (from ReplicaID), replica tag (from ReplicaID),
    multiplex model ids, and routing stats.
    r   Nr   r   )r)   r*   r+   rC   r/   r,   r   r   r
   r&   r   r	   r   r   r   r   r   r   ?  s
   
 r   c                   @   s   e Zd ZU dZeed< dS )gRPCRequestzKSent from the GRPC proxy to replicas on both unary and streaming codepaths.user_request_protoN)r)   r*   r+   rC   r   r,   r   r   r   r   r   L  s   
 r   c                   @      e Zd ZdZdZdZdS )RequestProtocol	UNDEFINEDHTTPgRPCN)r)   r*   r+   r   r   GRPCr   r   r   r   r   S      r   c                   @   r   )DeploymentHandleSourceUNKNOWNPROXYr   N)r)   r*   r+   r   r   r   r   r   r   r   r   Y  r   r   c                   @   s   e Zd ZU eed< eed< dZeed< dZeed< dZeed< dZeed< d	Z	e
ed
< dZeed< ejZeed< dZee ed< dZe
ed< ede
fddZede
fddZdS )RequestMetadata
request_idinternal_request_id__call__call_methodr;   rH   r   multiplexed_model_idFis_streaming_http_method_request_protocolNgrpc_contextT_by_referencer2   c                 C      | j tjkS r$   )r   r   r   r   r   r   r   is_http_request     zRequestMetadata.is_http_requestc                 C   r   r$   )r   r   r   r   r   r   r   is_grpc_request  r   zRequestMetadata.is_grpc_request)r)   r*   r+   r&   r,   r   rH   r   r   r   rE   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   _  s    
 r   c                   @   sv   e Zd ZdZddddedee deeege	e
 f  fddZed	efd
dZed	eege	e
 f fddZdS )StreamingHTTPRequestz?Sent from the HTTP proxy to replicas on the streaming codepath.N)proxy_actor_namereceive_asgi_messages
asgi_scoper   r   c                C   s4   || _ |d u r|d u rtd|| _d | _|| _d S )NzBEither proxy_actor_name or receive_asgi_messages must be provided.)_asgi_scoper>   _proxy_actor_name_cached_proxy_actor_receive_asgi_messages)r   r   r   r   r   r   r   __init__  s   	zStreamingHTTPRequest.__init__r2   c                 C   r   r$   )r   r   r   r   r   r     s   zStreamingHTTPRequest.asgi_scopec                 C   s.   | j d u rtj| jtd| _| jjj| _ | j S )N)	namespace)r   ray	get_actorr   r   r   r   remoter   r   r   r   r     s   
z*StreamingHTTPRequest.receive_asgi_messages)r)   r*   r+   rC   r   r   r&   r   r   r   bytesr   r   r   r   r   r   r   r   r     s"    
"r   c                   @   r   )TargetCapacityDirectionz9Determines what direction the target capacity is scaling.UPDOWNN)r)   r*   r+   rC   r   r   r   r   r   r   r     s    r   c                   @   s   e Zd ZU eed< eed< dS )ReplicaQueueLengthInfoacceptednum_ongoing_requestsN)r)   r*   r+   rE   r,   r   r   r   r   r   r     s   
 r   c                   @   sJ   e Zd ZU eeeef  ed< eed< eed< eed< dZe	e ed< dS )CreatePlacementGroupRequestbundlesstrategytarget_node_idr   Nruntime_env)
r)   r*   r+   r
   r	   r&   floatr,   r   r   r   r   r   r   r     s   
 r   )Bru   dataclassesr   r   r   enumr   typingr   r   r   r	   r
   r   starlette.typesr   r   	ray.actorr   ray.serve._private.constantsr   r   ray.serve.generated.serve_pb2r   r   r   r   r   r   ray.serve.grpc_utilr   ray.util.annotationsr   r4   r   r/   r&   NodeIdr   DurationApplicationNamerG   rL   re   rV   rU   rN   rW   r[   rX   r_   rT   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s|     :		  K1+.