
    1iP(                        U d dl Z d dlZd dlmZmZ d dlmZ d dlmZm	Z	m
Z
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 d d
lmZ dZdZdZdZ ej:                  e      Z G d de      Z  G d de      Z! G d de!      Z" G d de"      Z# G d de"      Z$ G d de"      Z% G d de      Z&e&jN                  Z(e&e)d<    G d de       Z* G d  d!e       Z+y)"    N)ABCabstractmethod)Enum)ListOptionalTupleUnion)Redis)DEFAULT_TIMEOUTAsyncHTTPClientWrapper)	NoBackoff)
HttpClient)UnhealthyDatabaseException)Retry      g      ?i  c                   "    e Zd Zedefd       Zy)HealthCheckreturnc                    K   yw)z(Function to determine the health status.N )selfdatabases     k/mnt/e/genesis-system/.venvs/voice-bridge/lib/python3.12/site-packages/redis/asyncio/multidb/healthcheck.pycheck_healthzHealthCheck.check_health         	   N)__name__
__module____qualname__r   boolr   r       r   r   r      s    d  r"   r   c                   p    e Zd ZdZeedefd              Zeedefd              Z	ede
e   defd       Zy)HealthCheckPolicyz)
    Health checks execution policy.
    r   c                      y)z*Number of probes to execute health checks.Nr   r   s    r   health_check_probesz%HealthCheckPolicy.health_check_probes"        	r"   c                      y)z"Delay between health check probes.Nr   r&   s    r   health_check_delayz$HealthCheckPolicy.health_check_delay(   r(   r"   health_checksc                    K   yw)z8Execute health checks and return database health status.Nr   r   r+   r   s      r   executezHealthCheckPolicy.execute.   r   r   N)r   r   r    __doc__propertyr   intr'   floatr*   r   r   r!   r.   r   r"   r   r$   r$      st     S    E    4+< 4  r"   r$   c                   h    e Zd ZdedefdZedefd       Zedefd       Ze	de
e   defd       Zy	)
AbstractHealthCheckPolicyr'   r*   c                 @    |dk  rt        d      || _        || _        y )N   z*health_check_probes must be greater than 0)
ValueError_health_check_probes_health_check_delay)r   r'   r*   s      r   __init__z"AbstractHealthCheckPolicy.__init__5   s&    "IJJ$7!#5 r"   r   c                     | j                   S N)r8   r&   s    r   r'   z-AbstractHealthCheckPolicy.health_check_probes;   s    (((r"   c                     | j                   S r<   )r9   r&   s    r   r*   z,AbstractHealthCheckPolicy.health_check_delay?   s    '''r"   r+   c                    K   y wr<   r   r-   s      r   r.   z!AbstractHealthCheckPolicy.executeC   s	     r   N)r   r   r    r1   r2   r:   r0   r'   r*   r   r   r   r!   r.   r   r"   r   r4   r4   4   sr    6C 6U 6 )S ) ) (E ( ( 4+< 4  r"   r4   c                   B     e Zd ZdZdedef fdZdee   de	fdZ
 xZS )HealthyAllPolicyzM
    Policy that returns True if all health check probes are successful.
    r'   r*   c                 &    t         |   ||       y r<   superr:   r   r'   r*   	__class__s      r   r:   zHealthyAllPolicy.__init__M       ,.@Ar"   r+   r   c                 B  K   |D ]t  }t        | j                        D ]Z  }	 |j                  |       d {   s  y	 || j                  dz
  k  s4t        j                  | j                         d {    \ v y7 G# t        $ r}t	        d||      d }~ww xY w7 )w)NFUnhealthy databaser6   Tranger'   r   	Exceptionr   asynciosleepr9   )r   r+   r   health_checkattemptes         r   r.   zHealthyAllPolicy.executeP   s     ) 		BL !9!9: BX!-!:!:8!DDD$ E
 T5599!--(@(@AAAB		B  E  X45I8UVWWX BsI   BA?A=A?B"B3B4	B=A??	BBBBr   r   r    r/   r1   r2   r:   r   r   r!   r.   __classcell__rE   s   @r   r@   r@   H   s6    BC BU B4+< 4 r"   r@   c                   B     e Zd ZdZdedef fdZdee   de	fdZ
 xZS )HealthyMajorityPolicyzW
    Policy that returns True if a majority of health check probes are successful.
    r'   r*   c                 &    t         |   ||       y r<   rB   rD   s      r   r:   zHealthyMajorityPolicy.__init__c   rF   r"   r+   r   c                   K   |D ]  }| j                   dz  dk(  r| j                   dz  }n| j                   dz   dz  }t        | j                         D ]c  }	 |j                  |       d {   s|dz  }|dk  r  y|| j                   dz
  k  s=t        j                  | j                         d {    e  y7 P# t        $ r!}|dz  }|dk  rt	        d||      Y d }~fd }~ww xY w7 8w)N   r   r6   FrH   T)r'   rJ   r   rK   r   rL   rM   r9   )r   r+   r   rN   allowed_unsuccessful_probesrO   rP   s          r   r.   zHealthyMajorityPolicy.executef   s    ) 	BL''!+q0.2.F.F.J+/3/G/G!/Kq.P+ !9!9: B
!-!:!:8!DDD3q836!;#( T5599!--(@(@AAAB	B*  E ! /14/2a780(A  8 BsT   AC+B<)B:*B<8C+"C+0C)1	C+:B<<	C&C!C+!C&&C+rQ   rS   s   @r   rU   rU   ^   s6    BC BU B4+< 4 r"   rU   c                   B     e Zd ZdZdedef fdZdee   de	fdZ
 xZS )HealthyAnyPolicyzT
    Policy that returns True if at least one health check probe is successful.
    r'   r*   c                 &    t         |   ||       y r<   rB   rD   s      r   r:   zHealthyAnyPolicy.__init__   rF   r"   r+   r   c                 z  K   d}|D ]  }d }t        | j                        D ]]  }	 |j                  |       d {   rd} n?d}	 || j                  dz
  k  s7t        j                  | j                         d {    _ |s|s|c S |r|s| |S 7 Z# t        $ r}t	        d||      }Y d }~ld }~ww xY w7 >w)NFTrH   r6   rI   )r   r+   r   
is_healthyrN   	exceptionrO   rP   s           r   r.   zHealthyAnyPolicy.execute   s     
) 	 LI !9!9: B	)66x@@@%)
%*
 T5599!--(@(@AAAB i!!I+	 . % A
 !  :,h!I Bsh   "B;BBB B;BB;"B;:B9;B;B;B;B	B6B1,B;1B66B;rQ   rS   s   @r   r[   r[      s6    BC BU B4+< 4 r"   r[   c                       e Zd ZeZeZeZy)HealthCheckPoliciesN)	r   r   r    r@   HEALTHY_ALLrU   HEALTHY_MAJORITYr[   HEALTHY_ANYr   r"   r   ra   ra      s    "K,"Kr"   ra   DEFAULT_HEALTH_CHECK_POLICYc                       e Zd ZdZdefdZy)PingHealthCheckz-
    Health check based on PING command.
    r   c                   K   t        |j                  t              r#|j                  j                  d       d {   S |j                  j	                         }|D ]'  }|j
                  j                  d       d {   r' y y7 K7 w)NPINGFT)
isinstanceclientr
   execute_command	get_nodesredis_connection)r   r   	all_nodesnodes       r   r   zPingHealthCheck.check_health   s~     hoou-!88@@@ !113I! !!22BB6JJJ !  A
 Ks(   9BBAB=B	>BB	BN)r   r   r    r/   r!   r   r   r"   r   rg   rg      s    
d 
r"   rg   c                       e Zd ZdZdeeddddddddfdedededee	e
e
f      d	ed
ee
   dee
   deee
ef      dee
   dee
   dee
   fdZdefdZy)LagAwareHealthCheckz
    Health check available for Redis Enterprise deployments.
    Verify via REST API that the database is healthy based on different lags.
    i$  NTrest_api_portlag_aware_tolerancetimeout
auth_basic
verify_tlsca_fileca_pathca_dataclient_cert_fileclient_key_fileclient_key_passwordc                     t        t        ||t        t               d      |||||	|
|
            | _        || _        || _        y)a  
        Initialize LagAwareHealthCheck with the specified parameters.

        Args:
            rest_api_port: Port number for Redis Enterprise REST API (default: 9443)
            lag_aware_tolerance: Tolerance in lag between databases in MS (default: 100)
            timeout: Request timeout in seconds (default: DEFAULT_TIMEOUT)
            auth_basic: Tuple of (username, password) for basic authentication
            verify_tls: Whether to verify TLS certificates (default: True)
            ca_file: Path to CA certificate file for TLS verification
            ca_path: Path to CA certificates directory for TLS verification
            ca_data: CA certificate data as string or bytes
            client_cert_file: Path to client certificate file for mutual TLS
            client_key_file: Path to client private key file for mutual TLS
            client_key_password: Password for encrypted client private key
        r   )retries)
ru   rv   retryrw   rx   ry   rz   r{   r|   r}   N)r   r   r   r   _http_client_rest_api_port_lag_aware_tolerance)r   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   s               r   r:   zLagAwareHealthCheck.__init__   sS    @ 3%IK3%!1 /$7
 ,$7!r"   r   c                   K   |j                   t        d      t        |j                  t              r|j                  j                         d   }n#|j                  j                  d   j                  }|j                    d| j                   }|| j                  j                  _
        d }| j                  j                  d       d {   D ]+  }|d   D ]!  }|d   |k(  r|} |d   D ]  }||k(  s	|} ! # - | t        j                  d	       t        d
      d|d    d| j                   }| j                  j                  |d       d {    y7 7 w)Nz[Database health check url is not set. Please check DatabaseConfig for the current database.hostr   :z/v1/bdbs	endpointsdns_nameaddrz8LagAwareHealthCheck failed: Couldn't find a matching bdbzCould not find a matching bdbz	/v1/bdbs/uidz=/availability?extend_check=lag&availability_lag_tolerance_ms=F)expect_jsonT)health_check_urlr7   rj   rk   r
   get_connection_kwargsstartup_nodesr   r   r   base_urlgetloggerwarningr   )	r   r   db_hostr   matching_bdbbdbendpointr   urls	            r   r   z LagAwareHealthCheck.check_health   s    $$,m  hoou-oo;;=fEGoo33A6;;G//0$2E2E1FG,4  ) **..z:: 
	C, 	J'72#&L %V, Dw'*	
	 NNUV<== U+, -??C?X?X>Y[ 	 ##CU#;;; / ;( 	<s+   C	EE(E5A EEEE)r   r   r    r/   DEFAULT_LAG_AWARE_TOLERANCEr   r1   r2   r   r   strr!   r	   bytesr:   r   r   r"   r   rr   rr      s     "#>(04!%!%/3*.)--1/8/8 !/8 	/8
 U38_-/8 /8 #/8 #/8 %U
+,/8 #3-/8 "#/8 &c]/8b'd 'r"   rr   ),rL   loggingabcr   r   enumr   typingr   r   r   r	   redis.asyncior
   redis.asyncio.http.http_clientr   r   redis.backoffr   redis.http.http_clientr   redis.multidb.exceptionr   redis.retryr   DEFAULT_HEALTH_CHECK_PROBESDEFAULT_HEALTH_CHECK_INTERVALDEFAULT_HEALTH_CHECK_DELAYr   	getLoggerr   r   r   r$   r4   r@   rU   r[   ra   rb   re   __annotations__rg   rr   r   r"   r   <module>r      s      #  / /  R # - >   !   " 			8	$#  . 1 (0 ,5 B"0 "J#$ # 4G3R3R 0 Rk $^+ ^r"   