
    &`ij                        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	 d dl
mZmZ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 d dl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%m&Z&m'Z' d dl(m)Z)m*Z* d dl+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8m9Z9 d dl:m;Z; dZ<dZ= G d de          Z> G d d          Z? G d d          Z@ G d d          ZA G d d           ZB G d! d"          ZC G d# d$          ZD G d% d&          ZE G d' d(          ZFejG         G d) d*                      ZHeHI                                ZJd+ ZKd, ZLe)fd-eMd.e&d/eNfd0ZOe)fd1eMd2eMd/ePfd3ZQe)fd-eMd4ePd2eMd/ePfd5ZRe)d6fd-eMd4ePd2eMd7eNd/ePf
d8ZSe)fd-eMd4ePd2eMd/ePfd9ZTd:efd;ZU	 	 dsd<e d=e%d>eeP         d?eeee-ePef                           fd@ZV ejW        e=e*d A           G dB dC                      ZX ejG        dDd iE           G dF dG                      ZYeYI                                ZZdH Z[e=fdIe1dJedKeMfdLZ\dtdMZ]dtdNZ^dtdOZ_dP Z`dQ ZadR ZbdS ZcedTe fdU            Zd G dV dW          Ze G dX dY          Zf G dZ d[          ZgejW        d\             Zhd4ePfd]Zie)dfd1eMd2eMd^e"fd_ZjejW         G d` da                      ZkdudceMddeMfdeZle'jm        fdfe"d2eMdgeeMe'f         fdhZne'jm        e)did6d6d6fdgeeMe'f         d2eMdjeNdkeNdleNdmeNd/eeM         fdnZoe'jm        e)did6d6d6fdgeeMe'f         d2eMdjeNdkeNdleNdmeNd/eMfdoZpe)fd2eMfdpZqdqe)fdrZrdS )v    N)asynccontextmanager)copydeepcopy)AnyCallableDictListOptionalTupleUnion)Request)serve)build_address)wait_for_condition)	TimerBase)ActorHandle)ServeControllerClient)CreatePlacementGroupRequestDeploymentIDDeploymentStatusRequestProtocol)SERVE_DEFAULT_APP_NAMESERVE_NAMESPACE)ALL_REPLICA_STATESReplicaState)DRAINING_MESSAGE)ServeUsageTag)_get_global_client)	serve_pb2serve_pb2_grpc)ApplicationStatusTargetGroup)list_actorsz
/telemetrystoragec                   f    e Zd Zddee         fdZddee         fdZdefdZdefdZd	efd
Z	dS )	MockTimerN
start_timec                 b    t          j                    | _        |                     |           d S )Nr'   )	threadingLock_lockresetselfr'   s     q/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/serve/_private/test_utils.py__init__zMockTimer.__init__.   s+    ^%%


j
)))))    c                 >    |t          j                     }|| _        d S N)time_currr.   s     r0   r-   zMockTimer.reset2   s    J


r2   returnc                     | j         S r4   r6   r/   s    r0   r5   zMockTimer.time7   
    zr2   byc                 f    | j         5  | xj        |z  c_        d d d            d S # 1 swxY w Y   d S r4   r,   r6   )r/   r<   s     r0   advancezMockTimer.advance:   s~    Z 	 	JJ"JJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   &**amtc                 l    | j         5  | xj        |dz   z  c_        d d d            d S # 1 swxY w Y   d S )NgMbP?r>   r/   r@   s     r0   realistic_sleepzMockTimer.realistic_sleep>   s    Z 	& 	&JJ#+%JJ	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   )--r4   )
__name__
__module____qualname__r
   floatr1   r-   r5   r?   rC    r2   r0   r&   r&   -   s        * *8E? * * * *           
e    %    &5 & & & & & &r2   r&   c                   Z    e Zd Zddee         fdZddZdefdZdefdZdefd	Z	d
 Z
dS )MockAsyncTimerr   r'   c                 @    |                      |           d| _        d S )Nr)   r   )r-   _num_sleepersr.   s     r0   r1   zMockAsyncTimer.__init__D   s$    

j
)))r2   c                     || _         d S r4   r9   r.   s     r0   r-   zMockAsyncTimer.resetH   s    


r2   r7   c                     | j         S r4   r9   r:   s    r0   r5   zMockAsyncTimer.timeK   r;   r2   r@   c                    K   | xj         dz  c_         | j        |z   }| j        |k     r%t          j        d           d {V  | j        |k     %| xj         dz  c_         d S )N   r   )rL   r6   asynciosleep)r/   r@   ends      r0   rR   zMockAsyncTimer.sleepN   s      aj3 j3-""""""""" j3 	ar2   c                 &    | xj         |z  c_         d S r4   r9   rB   s     r0   r?   zMockAsyncTimer.advanceX   s    

c



r2   c                     | j         S r4   )rL   r:   s    r0   num_sleeperszMockAsyncTimer.num_sleepers[       !!r2   N)r   )r'   r   )rD   rE   rF   r
   rG   r1   r-   r5   rR   r?   rV   rH   r2   r0   rJ   rJ   C   s         8E?           e     u        5    " " " " "r2   rJ   c                   H    e Zd Zd ZdededefdZdedefdZdedefdZ	dS )	MockKVStorec                 ,    t                      | _        d S r4   )dictstorer:   s    r0   r1   zMockKVStore.__init__`   s    VV


r2   keyvalr7   c                     t          |t                    s/t          d                    t	          |                              || j        |<   dS )Nkey must be a string, got: {}.T
isinstancestr	TypeErrorformattyper\   )r/   r]   r^   s      r0   putzMockKVStore.putc   sH    #s## 	P<CCDIINNOOO
3tr2   c                     t          |t                    s/t          d                    t	          |                              | j                            |d           S )Nr`   )rb   rc   rd   re   rf   r\   getr/   r]   s     r0   ri   zMockKVStore.geti   sN    #s## 	P<CCDIINNOOOz~~c4(((r2   c                     t          |t                    s/t          d                    t	          |                              || j        v r
| j        |= dS dS )Nr`   TFra   rj   s     r0   deletezMockKVStore.deleten   sX    #s## 	P<CCDIINNOOO$*
34ur2   N)
rD   rE   rF   r1   rc   r   boolrg   ri   rl   rH   r2   r0   rY   rY   _   s          s      )s )s ) ) ) )
# $      r2   rY   c                   ^    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dd	e
d
edefdZd	e
d
efdZdS )MockClusterNodeInfoCachec                     t                      | _        t                      | _        t                      | _        t                      | _        t                      | _        d S r4   )setalive_node_idsr[   total_resources_per_nodeavailable_resources_per_nodedraining_nodesnode_labelsr:   s    r0   r1   z!MockClusterNodeInfoCache.__init__z   sD    !ee(,%,0FF)"ff66r2   c                     | j         S r4   )rr   r:   s    r0   get_alive_node_idsz+MockClusterNodeInfoCache.get_alive_node_ids       ""r2   c                     | j         S r4   )ru   r:   s    r0   get_draining_nodesz+MockClusterNodeInfoCache.get_draining_nodes   ry   r2   c                 :    | j         t          | j                  z
  S r4   )rr   rq   ru   r:   s    r0   get_active_node_idsz,MockClusterNodeInfoCache.get_active_node_ids   s    "S)<%=%===r2   c                     d S r4   rH   )r/   node_ids     r0   get_node_azz$MockClusterNodeInfoCache.get_node_az   s    tr2   c                     | j         S r4   )rt   r:   s    r0    get_available_resources_per_nodez9MockClusterNodeInfoCache.get_available_resources_per_node   s    00r2   c                     | j         S r4   )rs   r:   s    r0   get_total_resources_per_nodez5MockClusterNodeInfoCache.get_total_resources_per_node   s    ,,r2   Nr   	resourceslabelsc                     | j                             |           t          |          pi | j        |<   t          |          pi | j        |<   |pi | j        |<   d S r4   )rr   addr   rs   rt   rv   )r/   r   r   r   s       r0   add_nodez!MockClusterNodeInfoCache.add_node   sd    (((19)1D1D1J%g.5=i5H5H5NB)'2$*Lb!!!r2   c                 4    t          |          | j        |<   d S r4   )r   rt   )r/   r   r   s      r0    set_available_resources_per_nodez9MockClusterNodeInfoCache.set_available_resources_per_node   s    5=i5H5H)'222r2   NN)rD   rE   rF   r1   rx   r{   r}   r   r   r   rc   r   r   r   rH   r2   r0   ro   ro   y   s        " " "# # ## # #> > >  1 1 1- - -1 1 1 1T 1 1 1 1I I I I I I I Ir2   ro   c                       e Zd Zd ZdS )FakeRemoteFunctionc                     d S r4   rH   r:   s    r0   remotezFakeRemoteFunction.remote       r2   N)rD   rE   rF   r   rH   r2   r0   r   r      s#            r2   r   c                   @    e Zd Zd Zed             Zed             ZdS )MockActorHandlec                 >    || _         d| _        d| _        d| _        d S )Nfake_idF)_options	_actor_id"initialize_and_get_metadata_calledis_allocated_called)r/   kwargss     r0   r1   zMockActorHandle.__init__   s&    "27/#(   r2   c                 ,    d| _         t                      S NT)r   r   r:   s    r0   initialize_and_get_metadataz+MockActorHandle.initialize_and_get_metadata   s    26/!###r2   c                 ,    d| _         t                      S r   )r   r   r:   s    r0   is_allocatedzMockActorHandle.is_allocated   s    #' !###r2   N)rD   rE   rF   r1   propertyr   r   rH   r2   r0   r   r      sY        ) ) ) $ $ X$
 $ $ X$ $ $r2   r   c                   &    e Zd Zd Zd ZdefdZdS )MockActorClassc                 :    d| _         t                      | _        d S NrH   )
_init_argsr[   r   r:   s    r0   r1   zMockActorClass.__init__   s    r2   c                 l    t          |           }|                                D ]\  }}||j        |<   |S r4   )r   itemsr   )r/   r   reskvs        r0   optionszMockActorClass.options   s:    4jjLLNN 	  	 DAqCLOO
r2   r7   c                 (    t          dd|i| j        S )N	init_argsrH   )r   r   )r/   argss     r0   r   zMockActorClass.remote   s    ??????r2   N)rD   rE   rF   r1   r   r   r   rH   r2   r0   r   r      sT            @ @ @ @ @ @ @r2   r   c                       e Zd ZdefdZdS )MockPlacementGrouprequestc                 t    |j         | _        |j        | _        |j        | _        |j        | _        d| _        d S )Ndetached)	bundles_bundlesstrategy	_strategytarget_node_id_soft_target_node_idname_name	_lifetime)r/   r   s     r0   r1   zMockPlacementGroup.__init__   s4     )$+$:!\
#r2   N)rD   rE   rF   r   r1   rH   r2   r0   r   r      s0        $ ; $ $ $ $ $ $r2   r   c                   v    e Zd ZefdedefdZd Zd Zd Zde	e         fdZ
d	efd
Zd ZdefdZdefdZdS )MockDeploymentHandledeployment_nameapp_namec                 `    || _         || _        t          j        | _        d| _        d| _        d S )NF)_deployment_name	_app_namer   	UNDEFINED	_protocol_running_replicas_populated_initialized)r/   r   r   s      r0   r1   zMockDeploymentHandle.__init__   s1     /!(2+0(!r2   c                     | j         S r4   )r   r:   s    r0   is_initializedz#MockDeploymentHandle.is_initialized   s      r2   c                 @    | j         rt          d          d| _         d S )Nzalready initializedT)r   RuntimeErrorr:   s    r0   _initzMockDeploymentHandle._init   s*     	64555 r2   c                     | S r4   rH   )r/   r   r   s      r0   r   zMockDeploymentHandle.options   s    r2   depc                 8    |\  }}| j         |k    o
| j        |k    S r4   )r   r   )r/   r   other_deployment_nameother_app_names       r0   __eq__zMockDeploymentHandle.__eq__   s-    03-~!%:: 1.0	
r2   protocolc                     || _         d S r4   )r   )r/   r   s     r0   _set_request_protocolz*MockDeploymentHandle._set_request_protocol   s    !r2   c                     d S r4   rH   r:   s    r0   _get_or_create_routerz*MockDeploymentHandle._get_or_create_router   r   r2   r7   c                     | j         S r4   r   r:   s    r0   running_replicas_populatedz/MockDeploymentHandle.running_replicas_populated   s    //r2   r^   c                     || _         d S r4   r   )r/   r^   s     r0   set_running_replicas_populatedz3MockDeploymentHandle.set_running_replicas_populated   s    +.(((r2   N)rD   rE   rF   r   rc   r1   r   r   r   r   r   r   r   r   rm   r   r   rH   r2   r0   r   r      s        =S " " "s " " " "! ! !! ! !  
%* 
 
 
 
"o " " " "  0D 0 0 0 0/$ / / / / / /r2   r   c                       e Zd Zd ZdS )GetPIDc                 (    t          j                    S r4   )osgetpidr:   s    r0   __call__zGetPID.__call__   s    y{{r2   N)rD   rE   rF   r   rH   r2   r0   r   r      s#            r2   r   c                  R    	 t          j        d           dS # t          $ r Y dS w xY w)N%http://localhost:8265/api/ray/versionFT)requestsri   	ExceptionrH   r2   r0   check_ray_stoppedr      s?    <===u   tts    
&&c                  <    t          j        d          j        dk    S )Nr      )r   ri   status_coderH   r2   r0   check_ray_startedr     s    <?@@LPSSSr2   r   expected_statusr7   c                 r    t          j                    j        |         }|j        |          j        |k    sJ dS r   )r   statusapplicationsdeployments)r   r   r   
app_statuss       r0   check_deployment_statusr     s8     ,X6J!$'./AAAA4r2   r   r   c                     t          | |          }t          dd|                                fdg          }t          |          S )z<Get the replicas currently running for the given deployment.)r   r   
class_name=)stater   ALIVE)filters)r   r#   to_replica_actor_class_namelen)r   r   dep_idactorss       r0   get_num_alive_replicasr     sV    
 BBBF3 B B D DE#
  F v;;r2   targetc                 2    t          | |          |k    sJ dS )z#Check if num replicas is >= target.Tr   r   r   r   s      r0   check_num_replicas_gter  #  $    
 "$11V;;;;4r2   Fuse_controllerc                     |rWt          j                    j        |         j        |          }|j                            t          j        d          }||k    sJ nt          | |          |k    sJ dS )z#Check if num replicas is == target.r   T)	r   r   r   r   replica_statesri   r   RUNNINGr   )r   r   r   r  r   num_running_replicass         r0   check_num_replicas_eqr	  ,  sx      @lnn)(3?E"155l6JANN#v-----%dH55????4r2   c                 2    t          | |          |k    sJ dS )z#Check if num replicas is <= target.Tr   r  s      r0   check_num_replicas_lter  >  r  r2   appsc                 z    t          j                    }| D ]$}|j        |         j        t          j        k    sJ %dS r   r   r   r   r!   r  )r  r   r   s      r0   check_apps_runningr  G  sF    \^^F Q Q"8,37H7PPPPPP4r2   
controllerdeployment_idtotalby_statec                   
 t          j        | j                            |                    |5fdt          D             }                                |k    s
J |            ||D ]\  }}
t          |t                    sJ t          |t                    r|dk    sJ 
r3
fd                    |g          D             }t          |          }n                    |g          }d| d| d| d	}	||k    s
J |	            d
S )a  Uses _dump_replica_states_for_testing to check replica counts.

    Args:
        controller: A handle to the Serve controller.
        deployment_id: The deployment to check replica counts for.
        total: The total number of expected replicas for the deployment.
        by_state: A list of tuples of the form
            (replica state, number of replicas, filter function).
            Used for more fine grained checks.
    Nc                     i | ]<}                     |g          |t                               |g                    =S rH   )ri   r   ).0r   replicass     r0   
<dictcomp>z(check_replica_counts.<locals>.<dictcomp>e  sU     
 
 
||UG$$
3x||UG,,--
 
 
r2   r   c                 *    h | ]} |          |S rH   rH   )r  rchecks     r0   	<setcomp>z'check_replica_counts.<locals>.<setcomp>q  s&    PPP!uuQxxPAPPPr2   )statesz	Expected z for state z	 but got .T)
rayri    _dump_replica_states_for_testingr   r   countrb   r   intr   )r  r  r  r  replica_countsr   r!  filtered
curr_countmsgr  r  s             @@r0   check_replica_countsr'  P  sc     w3::=II H 
 
 
 
+
 
 

 ~~5(((.(((#+ 		, 		,E5%e\22222eS))8eqjjj8 <PPPPx||E7|'C'CPPP ]]

%^^E7^;;
MeMMMM
MMMC&&&&&&&4r2   )r   	namespacenum_cpusc                   <    e Zd Zd ZdeddfdZdefdZdefdZdS )TelemetryStoragec                 :    d| _         t                      | _        d S Nr   )reports_receivedr[   current_reportr:   s    r0   r1   zTelemetryStorage.__init__}  s     !"ffr2   reportr7   Nc                 4    | xj         dz  c_         || _        d S NrP   )r.  r/  )r/   r0  s     r0   store_reportzTelemetryStorage.store_report  s$    "$r2   c                     | j         S r4   )r/  r:   s    r0   
get_reportzTelemetryStorage.get_report  ry   r2   c                     | j         S r4   )r.  r:   s    r0   get_reports_receivedz%TelemetryStorage.get_reports_received      $$r2   )	rD   rE   rF   r1   r   r3  r5  r"  r7  rH   r2   r0   r+  r+  {  s{        % % %%4 %D % % % %#D # # # #%c % % % % % %r2   r+  r)  )ray_actor_optionsc                   $    e Zd Zd ZdedefdZdS )TelemetryReceiverc                 P    t          j        t          t                    | _        d S )N)r   r(  )r  	get_actorSTORAGE_ACTOR_NAMEr   r$   r:   s    r0   r1   zTelemetryReceiver.__init__  s    }*<XXXr2   r   r7   c                    K   |                                  d {V }t          j        | j        j                            |                     dS r   )jsonr  ri   r$   r3  r   )r/   r   r0  s      r0   r   zTelemetryReceiver.__call__  sM      ||~~%%%%%%)0088999tr2   N)rD   rE   rF   r1   r   rm   r   rH   r2   r0   r;  r;    sH        Y Y Yg $      r2   r;  c                  z    t                                           } t          j        t          dt
                     | S )u  Start a telemetry Serve app.

    Ray should be initialized before calling this method.

    NOTE: If you're running the TelemetryReceiver Serve app to check telemetry,
    remember that the receiver itself is counted in the telemetry. E.g. if you
    deploy a Serve app other than the receiver, the number of apps in the
    cluster is 2- not 1– since the receiver is also running.

    Returns a handle to a TelemetryStorage actor. You can use this actor
    to access the latest telemetry reports.
    	telemetry)r   route_prefix)r+  r   r   runreceiver_appTELEMETRY_ROUTE_PREFIX)r$   s    r0   start_telemetry_apprG    s2     %%''G	Il;QRRRRNr2   tagexpectedstorage_actor_namec                     t          j        |t                    }t          j        |j                                                  }t          |d                    |                     |          |k    sJ dS )N)r(  extra_usage_tagsT)r  r=  r   ri   r5  r   printget_value_from_report)rH  rI  rJ  storage_handler0  s        r0   check_telemetryrP    so     ]#5QQQNW^.557788F	&#
$%%%$$V,,88884r2   c                 R   dd l }t          j        |           }t          j                    }|r|                    t          j                  5 }|j        	                    |          \  }}d d d            n# 1 swxY w Y   |j
        }|                                t          j        j        k    sJ |                                t          k    sJ nT|j        	                    |          \  }	}
|
                                t          j        j        k    sJ |	j        |k    sJ dS )Nr   r   T)pytestr    RayServeAPIServiceStubr   ListApplicationsRequestraisesgrpcRpcErrorListApplications	with_callvaluecode
StatusCodeUNAVAILABLEdetailsr   OKapplication_names)channel	app_namestest_drainingrS  stubr   exception_info_	rpc_errorresponsecalls              r0   ping_grpc_list_applicationsrk    sa   MMM099D/11G 	7]]4=)) 	D^(2272CCDAq	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D"(	~~4?#>>>>>  ""&666666.888II$yy{{do00000)Y66664   A88A<?A<c                 T   dd l }t          j        |           }t          j                    }|r|                    t          j                  5 }|j        	                    |          \  }}d d d            n# 1 swxY w Y   |j
        }|                                t          j        j        k    sJ |                                t          k    sJ d S |j        	                    |          \  }}	|	                                t          j        j        k    sJ |j        dk    sJ d S )Nr   rR  success)rS  r    rT  r   HealthzRequestrV  rW  rX  HealthzrZ  r[  r\  r]  r^  r_  r   r`  message)
rb  rd  rS  re  r   rf  rg  rh  ri  rj  s
             r0   ping_grpc_healthzrr    sS   MMM099D&((G 	-]]4=)) 	;^<))')::DAq	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;"(	~~4?#>>>>>  ""&6666666///@@$yy{{do000009,,,,,,rl  c                    dd l }t          j        |           }t          j        ddd          }d|ff}|r|                    t          j                  5 }|j        	                    ||          \  }}d d d            n# 1 swxY w Y   |j
        }	|	                                t          j        j        k    sJ |	                                            d| d	|	                                v sJ d S |j        	                    ||          \  }
}|                                t          j        j        k    sJ |                                            |
j        d
k    sJ |
j                    d S )Nr   foo   barr   numrt  applicationr   metadatazApplication 'z' not found.zHello foo from bar)rS  r    UserDefinedServiceStubr   UserDefinedMessagerV  rW  rX  r   rZ  r[  r\  r]  	NOT_FOUNDr_  r`  greeting)rb  r   test_not_foundrS  re  r   r{  rf  rg  rh  ri  rj  s               r0   ping_grpc_call_methodr    s   MMM099D*25IIIG)+H 	L]]4=)) 	O^=**7X*NNDAq	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O"(	~~4?#<<<<inn>N>N<<<5x5559J9J9L9LLLLLLL0080TT$yy{{do0000$))++000 $8888(:K88888s    BB	Bc                     t          j        |           }t          j        ddd          }d|ff}|                    ||          }|j        dk    sJ d S )Nrt  ru  rv  rw  ry  rz  zHello foo from method1)r    r|  r   r}  Method1r  rb  r   re  r   r{  ri  s         r0   ping_grpc_another_methodr    sf    099D*25IIIG)+H||Gh|??H 8888888r2   c                     t          j        |           }t          j        ddd          }d}d|fd|ff}|                    ||          }|j        d	| k    sJ d S )
Nrt  ru  rv  rw  999ry  multiplexed_model_idrz  z%Method2 called model, loading model: )r    r|  r   r}  Method2r  )rb  r   re  r   r  r{  ri  s          r0   ping_grpc_model_multiplexingr    s    099D*25IIIG 	!	!56H ||Gh|??HI3GII	J 	J 	J 	J 	J 	Jr2   c                     t          j        |           }t          j        ddd          }d|ff}|                    ||          }t          |          D ]\  }}|j        | dk    sJ d S )Nrt  ru  rv  rw  ry  rz  z: Hello foo from bar)r    r|  r   r}  	Streaming	enumerater  )rb  r   re  r   r{  	responsesidxri  s           r0   ping_grpc_streamingr    s    099D*25IIIG)+HwBBI"9-- A AX s$@$@$@@@@@@A Ar2   c                     t          j        |           }t          j        dd          }d|ff}|                    ||          }|j        dk    sJ d S )N      )orangeapplery  rz      )r    FruitServiceStubr   FruitAmounts
FruitStandcostsr  s         r0   ping_fruit_standr    sb    *733D$AQ777G)+HwBBH>Rr2   signal_actorc                &  K   d}	 d W V  t          j        d           d {V  nZ# t           j        $ rH d}t          j        j                            d            | j                                         d {V  Y nw xY w|st          d          d S )NFd   TzGCancelledError wasn't raised during `send_signal_on_cancellation` block)
rQ   rR   CancelledErrorr  _rayletasync_task_idrq   sendr   r   )r  	cancelleds     r0   send_signal_on_cancellationr    s      I)mC          ! ) ) )	!%%d+++&&(((((((((((	)  
U
 
 	

 
s   & AA=<A=c                   V    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 Zd ZdS )FakeGrpcContextc                     ddi| _         dg| _        d| _        d| _        d| _        d | _        d | _        g | _        g | _        d S )Nr]   r[  )r]   r[  peers   peer_identitiespeer_identity_key)_auth_context_invocation_metadata_peer_peer_identities_peer_identity_key_code_details_trailing_metadatar:   s    r0   r1   zFakeGrpcContext.__init__'  sU    #W-%5$6!
 2"5
"$$&!!!r2   c                     | j         S r4   )r  r:   s    r0   auth_contextzFakeGrpcContext.auth_context2  rW   r2   c                     | j         S r4   r  r:   s    r0   r\  zFakeGrpcContext.code5  r;   r2   c                     | j         S r4   r  r:   s    r0   r_  zFakeGrpcContext.details8  s
    }r2   c                     | j         S r4   )r  r:   s    r0   r  zFakeGrpcContext.peer;  r;   r2   c                     | j         S r4   )r  r:   s    r0   peer_identitieszFakeGrpcContext.peer_identities>  r8  r2   c                     | j         S r4   )r  r:   s    r0   r  z!FakeGrpcContext.peer_identity_keyA      &&r2   c                     | j         S r4   r  r:   s    r0   trailing_metadataz!FakeGrpcContext.trailing_metadataD  r  r2   c                     || _         d S r4   r  )r/   r\  s     r0   set_codezFakeGrpcContext.set_codeG  s    


r2   c                     || _         d S r4   r  )r/   r_  s     r0   set_detailszFakeGrpcContext.set_detailsJ  s    r2   c                     || _         d S r4   r  )r/   r  s     r0   set_trailing_metadataz%FakeGrpcContext.set_trailing_metadataM  s    "3r2   c                     | j         S r4   )r  r:   s    r0   invocation_metadataz#FakeGrpcContext.invocation_metadataP  s    ((r2   N)rD   rE   rF   r1   r  r\  r_  r  r  r  r  r  r  r  r  rH   r2   r0   r  r  &  s        	' 	' 	'" " "      % % %' ' '' ' '       4 4 4) ) ) ) )r2   r  c                       e Zd Zd
dedee         fdZdeeef         fdZddee	e
f         deeef         fdZdeeef         fd	ZdS )	FakeGaugeNr   tag_keysc                 r    || _         t                      | _        |pd| _        t                      | _        d S r   )r   r[   valuestagsdefault_tagsr/   r   r  s      r0   r1   zFakeGauge.__init__U  1    	ffN	 FFr2   r  c                 d    |                                 D ]\  }}|| j        v sJ || j        |<   d S r4   r   r  r  r/   r  r]   rH  s       r0   set_default_tagszFakeGauge.set_default_tags\  J    

 	) 	)HC$)####%(Dc""	) 	)r2   r[  c                    | j                                         }|                    |pi            t          |                                          t          | j                  k    sJ | j        }| j        d d         D ]'}||         }||vrt                      ||<   ||         }(|||| j        d                  <   d S )N)r  r   updaterq   keysr  r  r[   )r/   r[  r  merged_tagsdrH  	tag_values          r0   rq   zFakeGauge.seta  s    ',,..4:2&&&;##%%&&#di..8888K9SbS> 	 	C#C(I!!#vv))AA(-+dim
$%%%r2   c                 l    | j         }| j        D ]$}||         }|                    |          }| d S %|S r4   )r  r  ri   r/   r  r[  rH  r  s        r0   	get_valuezFakeGauge.get_valueo  L    9 	 	CS	IIIi((E}  r2   r   r4   )rD   rE   rF   rc   r   r1   r   r  r   r"  rG   rq   r  rH   r2   r0   r  r  T  s        # #S #5: # # # #)T#s(^ ) ) ) )
. .sEz* .$sCx. . . . .d38n      r2   r  c                       e Zd Zddedee         fdZdeeef         fdZddee	e
f         deeef         fd	Zdeeef         d
e	fdZd ZdS )FakeCounterNr   r  c                 r    || _         t                      | _        |pd| _        t                      | _        d S r   )r   r[   countsr  r  r  s      r0   r1   zFakeCounter.__init__{  r  r2   r  c                 d    |                                 D ]\  }}|| j        v sJ || j        |<   d S r4   r  r  s       r0   r  zFakeCounter.set_default_tags  r  r2         ?r[  c                    | j                                         }|                    |pi            t          |                                          t          | j                  k    sJ | j        }| j        d d         D ]'}||         }||vrt                      ||<   ||         }(|| j        d                  }|                    |d          |z   ||<   d S )Nr  r   )	r  r   r  rq   r  r  r  r[   ri   )r/   r[  r  r  r  rH  r  r]   s           r0   inczFakeCounter.inc  s    ',,..4:2&&&;##%%&&#di..8888K9SbS> 	 	C#C(I!!#vv))AA$)B-(sA&#r2   r7   c                 l    | j         }| j        D ]$}||         }|                    |          }| d S %|S r4   )r  r  ri   r  s        r0   	get_countzFakeCounter.get_count  r  r2   c                     | j         S r4   )r  r:   s    r0   get_tagszFakeCounter.get_tags  s
    yr2   r   )r  N)rD   rE   rF   rc   r   r1   r   r  r   r"  rG   r  r  r  rH   r2   r0   r  r  z  s        # #S #5: # # # #)T#s(^ ) ) ) )
' 'sEz* 'S#X ' ' ' 'd38n         r2   r  c                  L    t          j                                                    S r4   )r  get_runtime_contextget_node_idrH   r2   r0   r  r    s    "$$00222r2   c                 j    d t          j                    D             }t          |          | k    sJ dS )Nc                 "    g | ]}|d          
|S )AliverH   )r  nodes     r0   
<listcomp>z)check_num_alive_nodes.<locals>.<listcomp>  s!    AAAD4=A4AAAr2   T)r  nodesr   )r   alive_nodess     r0   check_num_alive_nodesr    s9    AACIKKAAAK{v%%%%4r2   _clientc                 ~    |pt                      }|                                }|d         |         d         |          S )Nr   r   )r   get_serve_details)r   r   r  clientr_  s        r0   get_deployment_detailsr    s@    
 ,*,,F&&((G>"8,];OLLr2   c                   &    e Zd ZdefdZd Zd ZdS )Counterr   c                 R    d| _         || _        t          j                    | _        d S r-  )r!  r   rQ   Eventready_event)r/   r   s     r0   r1   zCounter.__init__  s$    
"=??r2   c                 |    | xj         dz  c_         | j         | j        k    r| j                                         d S d S r2  )r!  r   r  rq   r:   s    r0   r  zCounter.inc  sC    

a

:$$  """"" %$r2   c                 H   K   | j                                          d {V  d S r4   )r  waitr:   s    r0   r  zCounter.wait  s3      ##%%%%%%%%%%%r2   N)rD   rE   rF   r"  r1   r  r  rH   r2   r0   r  r    sM        +s + + + +
# # #
& & & & &r2   r  INFOslevelc                     t           j                                                             d          dd         }t          d| d| d|             dS )z&Convenient logging method for testing.z%H:%M:%S.%fN[z]  )datetimenowstrftimerM  )r  r  r  s      r0   tlogr    s\     



!
!
*
*=
9
9#2#
>C	
 e
 
 s
 
 Q
 
 !!!!!r2   r  r   c                     t          j        | j        j                            |                    }fd|D             }d |D             }t          |          dk    S )a%  Wait for target groups to be ready for the given app and protocol.

    Target groups are ready when there are at least one target for the given protocol. And it's
    possible that target groups are not ready immediately. An example is when the controller
    is recovering from a crash.
    c                 *    g | ]}|j         k    |S rH   r   r  target_groupr   s     r0   r  z-check_target_groups_ready.<locals>.<listcomp>  1        H,, 	,,,r2   c                 &    g | ]}|j         D ]}|S rH   )targets)r  r  r   s      r0   r  z-check_target_groups_ready.<locals>.<listcomp>  s<       |?S 5;   r2   r   )r  ri   _controllerget_target_groupsr   r   )r  r   r   target_groupsall_targetss     `  r0   check_target_groups_readyr    s     GF.@GGQQRRM   )  M
 #0  K {ar2   Tuse_localhostis_websocketexclude_route_prefixfrom_proxy_managerc                 V    t          d          }|                                }||d         v sJ d| d            |d         |         d         }|s|d}t           t                    rt	                      t          j        |j        j        	                    ||                    }	 fd	|	D             }	t          |	          d
k    rt          d| d  d|           g }
|	D ]}|j        D ]}|rdn|j        } t          j        k    r#|rdnd}| dt          ||j                   | }nI t          j        k    r'|rt          d          t          ||j                  }nt          d            |                    d          }|
                    |           |
S )ac  Get the URL of the application.

    Args:
        protocol: The protocol to use for the application.
        app_name: The name of the application.
        use_localhost: Whether to use localhost instead of the IP address.
            Set to True if Serve deployments are not exposed publicly or
            for low latency benchmarking.
        is_websocket: Whether the url should be served as a websocket.
        exclude_route_prefix: The route prefix to exclude from the application.
        from_proxy_manager: Whether the caller is a proxy manager.
    Returns:
        The URLs of the application.
    T)_health_check_controllerr   zApp zV not found in serve details. Use this method only when the app is known to be running.rC  N c                 *    g | ]}|j         k    |S rH   r  r  s     r0   r  z(get_application_urls.<locals>.<listcomp>  r  r2   r   zNo target group found for app z with protocol z and route prefix 	localhostwshttpz://z6is_websocket=True is not supported with gRPC protocol.zUnsupported protocol: /)r   r  rb   rc   r   r  ri   r  r  r   r   
ValueErrorr  ipHTTPr   portGRPCrstripappend)r   r   r  r  r  r   r  serve_detailsrC  r  urlsr  r   r*  schemeurls   `               r0   get_application_urlsr4    s0   ,  >>>F,,..MM.1111nhnnn 	211 0:>JL  |3(C   -"8,,'*w,33H>PQQ( (M   )  M
 =QpXpphppbnpp
 
 	
 D%  "* 	 	F -<69B?///!-96RRM"fk$B$BRLRR_111 $P   $B44 !D(!D!DEEE**S//CKK	 Kr2   c           
      N    t          j        t          | |||||                    S )a  Get the URL of the application.

    Args:
        protocol: The protocol to use for the application.
        app_name: The name of the application.
        use_localhost: Whether to use localhost instead of the IP address.
            Set to True if Serve deployments are not exposed publicly or
            for low latency benchmarking.
        is_websocket: Whether the url should be served as a websocket.
        exclude_route_prefix: The route prefix to exclude from the application.
        from_proxy_manager: Whether the caller is a proxy manager.
    Returns:
        The URL of the application. If there are multiple URLs, a random one is returned.
    )randomchoicer4  )r   r   r  r  r  r   s         r0   get_application_urlr8  )  s7    , = 	
 	
	 	 	r2   c                 l    t          j                    j        |          j        t          j        k    sJ dS r   r  r   s    r0   check_runningr;  K  s-    <>>&x07;L;TTTTT4r2   ru  c                      dd idt           f fd}	 t          |            d         S # t          $ r}t          |d }~ww xY w)Nrespr7   c                      	 t          d          } t          j        |           d<   dS # t          j        t          f$ r Y dS w xY w)Nr+  r:  timeoutr=  TF)r8  httpxri   RequestError
IndexError)r3  r   result_holderr@  s    r0   _attemptz&request_with_retries.<locals>._attemptS  sb    	%fx@@@C$)Ic7$C$C$CM&!4"J/ 	 	 	55	s   */ A	A	r?  )rm   r   r   TimeoutError)r@  r   rE  erD  s   ``  @r0   request_with_retriesrH  P  s    TNMd        "8W5555V$$ " " "!"s   1 
AAAr   )F)r  )srQ   r  r   r6  r*   r5   
contextlibr   r   r   typingr   r   r   r	   r
   r   r   rW  rA  r   starlette.requestsr   r  r   ray._common.network_utilsr   ray._common.test_utilsr   ray._common.utilsr   	ray.actorr   ray.serve._private.clientr   ray.serve._private.commonr   r   r   r   ray.serve._private.constantsr   r   #ray.serve._private.deployment_stater   r   ray.serve._private.proxyr   ray.serve._private.usager   ray.serve.contextr   ray.serve.generatedr   r    ray.serve.schemar!   r"   ray.util.stater#   rF  r>  r&   rJ   rY   ro   r   r   r   r   r   
deploymentr   bindget_pid_entrypointr   r   rc   rm   r   r"  r   r  r	  r  r  r'  r   r+  r;  rE  rG  rP  rk  rr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r+  r  r4  r8  r;  rH  rH   r2   r0   <module>r]     sS
     				       * * * * * *         D D D D D D D D D D D D D D D D D D    & & & & & & 



       3 3 3 3 3 3 5 5 5 5 5 5 ' ' ' ' ' ' ! ! ! ! ! ! ; ; ; ; ; ;                   Q P P P P P P P 5 5 5 5 5 5 2 2 2 2 2 2 0 0 0 0 0 0 9 9 9 9 9 9 9 9 ; ; ; ; ; ; ; ; & & & & & &%  & & & & &	 & & &," " " " " " " "8       4!I !I !I !I !I !I !I !IH       
$ $ $ $ $ $ $ $&@ @ @ @ @ @ @ @"$ $ $ $ $ $ $ $%/ %/ %/ %/ %/ %/ %/ %/P        
 [[]]   T T T
 <R 
 0	    +A $'     -C 
&)    + 	 
  	
 	   & -C 
&)   T      CG	( ((( C=( tE,X"=>?@	( ( ( (V #KKK% % % % % % % LK%  ZO444       54 !%%''  ( BT 	"%;>      $- - - -"L L L L$9 9 9  A A A      
K 
 
 
 
"+) +) +) +) +) +) +) +)\# # # # # # # #L' ' ' ' ' ' ' 'T 3 3 3#     +%)M MMM #M M M M & & & & & & & &" "C " " " " " -<,@   !   C()       0 -<,@*!&$? ?C()?? ? 	?
 ? ? 
#Y? ? ? ?F -<,@*!&$ C()  	
   	   D #9  C    
 "$.D " " " " " "r2   