
    phP(                        % S SK r S SKrS SKJrJr  S SKJr  S SKJrJ	r	J
r
Jr  S SKJr  S SKJrJr  S SKJr  S SKJr  S S	KJr  S S
KJr  SrSrSrSr\R:                  " \5      r " S S\5      r  " S S\5      r! " S S\!5      r" " S S\"5      r# " S S\"5      r$ " S S\"5      r% " S S\5      r&\&RN                  r(\&\)S'    " S S\ 5      r* " S  S!\ 5      r+g)"    N)ABCabstractmethod)Enum)ListOptionalTupleUnion)Redis)DEFAULT_TIMEOUTAsyncHTTPClientWrapper)	NoBackoff)
HttpClient)UnhealthyDatabaseException)Retry      g      ?i  c                   ,    \ rS rSr\S\4S j5       rSrg)HealthCheck   returnc                    #    g7f)z(Function to determine the health status.N )selfdatabases     [/home/james-whalen/.local/lib/python3.13/site-packages/redis/asyncio/multidb/healthcheck.pycheck_healthHealthCheck.check_health   
      	   r   N)__name__
__module____qualname____firstlineno__r   boolr   __static_attributes__r       r   r   r      s    d  r&   r   c                   ~    \ rS rSrSr\\S\4S j5       5       r\\S\	4S j5       5       r
\S\\   S\4S j5       rSrg	)
HealthCheckPolicy   z!
Health checks execution policy.
r   c                     g)z*Number of probes to execute health checks.Nr   r   s    r   health_check_probes%HealthCheckPolicy.health_check_probes"        	r&   c                     g)z"Delay between health check probes.Nr   r+   s    r   health_check_delay$HealthCheckPolicy.health_check_delay(   r.   r&   health_checksc                    #    g7f)z8Execute health checks and return database health status.Nr   r   r2   r   s      r   executeHealthCheckPolicy.execute.   r   r   r   N)r    r!   r"   r#   __doc__propertyr   intr,   floatr0   r   r   r$   r5   r%   r   r&   r   r(   r(      st     S    E    4+< 4  r&   r(   c                   x    \ rS rSrS\S\4S jr\S\4S j5       r\S\4S j5       r	\
S\\   S\4S	 j5       rS
rg)AbstractHealthCheckPolicy4   r,   r0   c                 >    US:  a  [        S5      eXl        X l        g )N   z*health_check_probes must be greater than 0)
ValueError_health_check_probes_health_check_delay)r   r,   r0   s      r   __init__"AbstractHealthCheckPolicy.__init__5   s"    "IJJ$7!#5 r&   r   c                     U R                   $ N)rA   r+   s    r   r,   -AbstractHealthCheckPolicy.health_check_probes;   s    (((r&   c                     U R                   $ rF   )rB   r+   s    r   r0   ,AbstractHealthCheckPolicy.health_check_delay?   s    '''r&   r2   c                    #    g 7frF   r   r4   s      r   r5   !AbstractHealthCheckPolicy.executeC   s     r   )rB   rA   N)r    r!   r"   r#   r9   r:   rC   r8   r,   r0   r   r   r   r$   r5   r%   r   r&   r   r<   r<   4   sr    6C 6U 6 )S ) ) (E ( ( 4+< 4  r&   r<   c                   P   ^  \ rS rSrSrS\S\4U 4S jjrS\\	   S\
4S jrS	rU =r$ )
HealthyAllPolicyH   zE
Policy that returns True if all health check probes are successful.
r,   r0   c                 $   > [         TU ]  X5        g rF   superrC   r   r,   r0   	__class__s      r   rC   HealthyAllPolicy.__init__M       ,Ar&   r2   r   c                 X  #    U H~  n[        U R                  5       Hb  n UR                  U5      I S h  vN (       d      g X@R                  S-
  :  d  M:  [
        R                  " U R                  5      I S h  vN   Md     M     g NR! [         a  n[	        SX%5      eS nAff = f N-7f)NFUnhealthy databaser?   Tranger,   r   	Exceptionr   asynciosleeprB   )r   r2   r   health_checkattemptes         r   r5   HealthyAllPolicy.executeP   s     )L !9!9:X!-!:!:8!DDD$ E
 5599!--(@(@AAA ; *  E  X45I8WWX BsI   B*B
B	B
B*#B*:B(;B*B


B%B  B%%B*r   r    r!   r"   r#   r7   r9   r:   rC   r   r   r$   r5   r%   __classcell__rS   s   @r   rM   rM   H   s;    BC BU B4+< 4  r&   rM   c                   P   ^  \ rS rSrSrS\S\4U 4S jjrS\\	   S\
4S jrS	rU =r$ )
HealthyMajorityPolicy^   zO
Policy that returns True if a majority of health check probes are successful.
r,   r0   c                 $   > [         TU ]  X5        g rF   rP   rR   s      r   rC   HealthyMajorityPolicy.__init__c   rU   r&   r2   r   c                   #    U H  nU R                   S-  S:X  a  U R                   S-  nOU R                   S-   S-  n[        U R                   5       Hl  n UR                  U5      I S h  vN (       d  US-  nUS::  a      gXPR                   S-
  :  d  MD  [
        R                  " U R                  5      I S h  vN   Mn     M     g N\! [         a!  nUS-  nUS::  a  [	        SX&5      e S nANmS nAff = f N=7f)N   r   r?   FrW   T)r,   rY   r   rZ   r   r[   r\   rB   )r   r2   r   r]   allowed_unsuccessful_probesr^   r_   s          r   r5   HealthyMajorityPolicy.executef   s    )L''!+q0.2.F.F.J+/3/G/G!/Kq.P+ !9!9:
!-!:!:8!DDD3q836!;#( 5599!--(@(@AAA ; **  E ! /14/2a780(  8 BsT   AC9C	*C+C	?C9#C99C7:C9C		
C4C/*C9/C44C9r   ra   rc   s   @r   re   re   ^   s;    BC BU B4+< 4  r&   re   c                   P   ^  \ rS rSrSrS\S\4U 4S jjrS\\	   S\
4S jrS	rU =r$ )
HealthyAnyPolicy   zL
Policy that returns True if at least one health check probe is successful.
r,   r0   c                 $   > [         TU ]  X5        g rF   rP   rR   s      r   rC   HealthyAnyPolicy.__init__   rU   r&   r2   r   c                   #    SnU H  nS n[        U R                  5       He  n UR                  U5      I S h  vN (       a  Sn  OCSn X`R                  S-
  :  d  M=  [
        R                  " U R                  5      I S h  vN   Mg     U(       d  U(       d  Us  $ U(       a  M  U(       d  M  Ue   U$  Nz! [         a  n[	        SX'5      n S nANS nAff = f NW7f)NFTrW   r?   rX   )r   r2   r   
is_healthyr]   	exceptionr^   r_   s           r   r5   HealthyAnyPolicy.execute   s     
)LI !9!9:	)66x@@@%)
%*
 5599!--(@(@AAA ; i!!ZII+ *. % A
 !  :,h!I Bsh   "CB6B4B6CB6	C#CCC%C.C4B66
C CCCCr   ra   rc   s   @r   rn   rn      s;    BC BU B4+< 4  r&   rn   c                        \ rS rSr\r\r\r	Sr
g)HealthCheckPolicies   r   N)r    r!   r"   r#   rM   HEALTHY_ALLre   HEALTHY_MAJORITYrn   HEALTHY_ANYr%   r   r&   r   rw   rw      s    "K,"Kr&   rw   DEFAULT_HEALTH_CHECK_POLICYc                   &    \ rS rSrSrS\4S jrSrg)PingHealthCheck   z%
Health check based on PING command.
r   c                 2  #    [        UR                  [        5      (       a#  UR                  R                  S5      I S h  vN $ UR                  R	                  5       nU H-  nUR
                  R                  S5      I S h  vN (       a  M-    g   g NR N7f)NPINGFT)
isinstanceclientr
   execute_command	get_nodesredis_connection)r   r   	all_nodesnodes       r   r   PingHealthCheck.check_health   sz     hoou--!88@@@ !113I!!22BB6JJJ  "  A
 Ks*   >B BABBBBBr   N)r    r!   r"   r#   r7   r$   r   r%   r   r&   r   r~   r~      s    
d 
r&   r~   c                       \ rS rSrSrS\\SSSSSSSS4S\S\S\S	\	\
\\4      S
\S\	\   S\	\   S\	\\\4      S\	\   S\	\   S\	\   4S jjrS\4S jrSrg)LagAwareHealthCheck   z
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                 |    [        [        UU[        [        5       SS9UUUUU	U
US9
5      U l        Xl        X l        g)a3  
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)
r   r   retryr   r   r   r   r   r   r   N)r   r   r   r   _http_client_rest_api_port_lag_aware_tolerance)r   r   r   r   r   r   r   r   r   r   r   r   s               r   rC   LagAwareHealthCheck.__init__   sO    @ 3%IK3%!1 /$7
 ,$7!r&   r   c                   #    UR                   c  [        S5      e[        UR                  [        5      (       a  UR                  R                  5       S   nO#UR                  R                  S   R                  nUR                    SU R                   3nX0R                  R                  l
        S nU R                  R                  S5      I S h  vN  H3  nUS    H'  nUS   U:X  a  Un  M  US    H  nXr:X  d  M
  Un  M%     M)     M5     Uc   [        R                  S	5        [        S
5      eSUS    SU R                   3nU R                  R                  USS9I S h  vN   g N N7f)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_urlr@   r   r   r
   get_connection_kwargsstartup_nodesr   r   r   base_urlgetloggerwarningr   )	r   r   db_hostr   matching_bdbbdbendpointr   urls	            r   r    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'* - - ; NNUV<== U+, -??C?X?X>Y[ 	 ##CU#;;; / ;( 	<s+   CE+E'(E+=A$E+!E)"E+)E+)r   r   r   )r    r!   r"   r#   r7   DEFAULT_LAG_AWARE_TOLERANCEr   r9   r:   r   r   strr$   r	   bytesrC   r   r%   r   r&   r   r   r      s     "#>(04!%!%/3*.)--1/8/8 !/8 	/8
 U38_-/8 /8 #/8 #/8 %U
+,/8 #3-/8 "#/8 &c]/8b'd 'r&   r   ),r[   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(   r<   rM   re   rn   rw   ry   r|   __annotations__r~   r   r   r&   r   <module>r      s      #  / /  R # - >   !   " 			8	$#  . 1 (0 ,5 B"0 "J#$ # 4G3R3R 0 Rk $^+ ^r&   