o
    پiY                     @   s   d 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	 ej
d dkr2ej
d dkr2ddlmZ ejjd	 jZd
ZG dd dZdd ZG dd de	jZdS )z<Reference implementation for health checking in gRPC Python.    N)
health_pb2)health_pb2_grpc         )_asyncHealth c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )_Watcherc                 C   s   t  | _t | _d| _d S )NT)	threading	Condition
_conditioncollectionsdeque
_responses_openself r   I/home/ubuntu/.local/lib/python3.10/site-packages/grpc_health/v1/health.py__init__#   s   


z_Watcher.__init__c                 C   s   | S Nr   r   r   r   r   __iter__(   s   z_Watcher.__iter__c                 C   sb   | j $ | js| jr| j   | js| js
| jr$| j W  d    S t 1 s*w   Y  d S r   )r   r   r   waitpopleftStopIterationr   r   r   r   _next+   s   
z_Watcher._nextc                 C      |   S r   r   r   r   r   r   next3      z_Watcher.nextc                 C   r   r   r   r   r   r   r   __next__6   r    z_Watcher.__next__c                 C   sB   | j  | j| | j   W d    d S 1 sw   Y  d S r   )r   r   appendnotify)r   responser   r   r   add9   s   "z_Watcher.addc                 C   s<   | j  d| _| j   W d    d S 1 sw   Y  d S )NF)r   r   r#   r   r   r   r   close>   s   "z_Watcher.closeN)
__name__
__module____qualname__r   r   r   r   r!   r%   r&   r   r   r   r   r
   "   s    r
   c                    s    fdd}|S )Nc                    s"   | d u r
    d S  |  d S r   )r&   r%   )r$   watcherr   r   send_response_callbackE   s   zJ_watcher_to_send_response_callback_adapter.<locals>.send_response_callbackr   )r+   r,   r   r*   r   *_watcher_to_send_response_callback_adapterD   s   r-   c                   @   sF   e Zd ZdZ	dddZdd Zdd	 Zdd
dZdd Zdd Z	dS )HealthServicerz,Servicer handling RPCs for service statuses.TNc                 C   s<   t  | _dtjji| _i | _|| jj	_
|| jj	_d| _d S )Nr	   F)r   RLock_lock_health_pb2HealthCheckResponseSERVING_server_status_send_response_callbacksWatch__func__experimental_non_blockingexperimental_thread_pool_gracefully_shutting_down)r   r8   r9   r   r   r   r   Q   s   


zHealthServicer.__init__c                    s    fdd}|S )Nc                      sB    j   j  W d    n1 sw   Y  d  d S r   )r0   r5   remover   r   r,   servicer   r   callback^   s   
z3HealthServicer._on_close_callback.<locals>.callbackr   )r   r,   r=   r>   r   r<   r   _on_close_callback]   s   z!HealthServicer._on_close_callbackc                 C   sp   | j + | j|j}|d u r!|tjj t	 W  d    S tj	|dW  d    S 1 s1w   Y  d S Nstatus)
r0   r4   getr=   set_codegrpc
StatusCode	NOT_FOUNDr1   r2   )r   requestcontextrB   r   r   r   Checkg   s   
$zHealthServicer.Checkc                 C   s   d }|d u rt  }t|}|j}| j; | j|}|d u r"tjj}|tj|d || j	vr5t
 | j	|< | j	| | || || W d    |S 1 sQw   Y  |S r@   )r
   r-   r=   r0   r4   rC   r1   r2   SERVICE_UNKNOWNr5   setr%   add_callbackr?   )r   rH   rI   r,   blocking_watcherr=   rB   r   r   r   r6   p   s2   



zHealthServicer.Watchc                 C   s   | j 7 | jr	 W d   dS || j|< || jv r*| j| D ]}|tj|d qW d   dS W d   dS 1 s=w   Y  dS )zSets the status of a service.

        Args:
          service: string, the name of the service.
          status: HealthCheckResponse.status enum value indicating the status of
            the service
        NrA   )r0   r:   r4   r5   r1   r2   )r   r=   rB   r,   r   r   r   rL      s    


"zHealthServicer.setc                 C   sf   | j & | jr	 W d   dS | jD ]
}| |tjj qd| _W d   dS 1 s,w   Y  dS )a0  Permanently sets the status of all services to NOT_SERVING.

        This should be invoked when the server is entering a graceful shutdown
        period. After this method is invoked, future attempts to set the status
        of a service will be ignored.

        This is an EXPERIMENTAL API.
        NT)r0   r:   r4   rL   r1   r2   NOT_SERVING)r   r=   r   r   r   enter_graceful_shutdown   s   	
"z&HealthServicer.enter_graceful_shutdown)TNr   )
r'   r(   r)   __doc__r   r?   rJ   r6   rL   rP   r   r   r   r   r.   N   s    


	r.   )rQ   r   sysr   rE   grpc_health.v1r   r1   r   _health_pb2_grpcversion_infor	   r   aio
DESCRIPTORservices_by_name	full_nameSERVICE_NAMEOVERALL_HEALTHr
   r-   r.   r   r   r   r   <module>   s   "
