
    ph)'                        % S SK r S SKJrJr  S SK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  S SKJrJr  S S	KJr  S S
KJr  SrSrSrSr\ R8                  " \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%\%RL                  r'\%\(S'    " S S\5      r) " S  S!\5      r*g)"    N)ABCabstractmethod)Enum)sleep)ListOptionalTupleUnion)Redis)	NoBackoff)DEFAULT_TIMEOUT
HttpClient)UnhealthyDatabaseException)Retry      g      ?i  c                   ,    \ rS rSr\S\4S j5       rSrg)HealthCheck   returnc                     g)z(Function to determine the health status.N )selfdatabases     S/home/james-whalen/.local/lib/python3.13/site-packages/redis/multidb/healthcheck.pycheck_healthHealthCheck.check_health        	    r   N)__name__
__module____qualname____firstlineno__r   boolr   __static_attributes__r   r   r   r   r      s      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)z8Execute health checks and return database health status.Nr   r   r1   r   s      r   executeHealthCheckPolicy.execute-   r   r   r   N)r    r!   r"   r#   __doc__propertyr   intr+   floatr/   r   r   r$   r4   r%   r   r   r   r'   r'      st     S    E    T+%6 T  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)AbstractHealthCheckPolicy3   r+   r/   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+   r/   s      r   __init__"AbstractHealthCheckPolicy.__init__4   s"    "IJJ$7!#5 r   r   c                     U R                   $ N)r@   r*   s    r   r+   -AbstractHealthCheckPolicy.health_check_probes:   s    (((r   c                     U R                   $ rE   )rA   r*   s    r   r/   ,AbstractHealthCheckPolicy.health_check_delay>   s    '''r   r1   c                     g rE   r   r3   s      r   r4   !AbstractHealthCheckPolicy.executeB   s    r   )rA   r@   N)r    r!   r"   r#   r8   r9   rB   r7   r+   r/   r   r   r   r$   r4   r%   r   r   r   r;   r;   3   sr    6C 6U 6 )S ) ) (E ( ( T+%6 T  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$ )
HealthyAllPolicyG   zE
Policy that returns True if all health check probes are successful.
r+   r/   c                 $   > [         TU ]  X5        g rE   superrB   r   r+   r/   	__class__s      r   rB   HealthyAllPolicy.__init__L       ,Ar   r1   r   c                    U Hc  n[        U R                  5       HG  n UR                  U5      (       d      g X@R                  S-
  :  d  M2  [        U R                  5        MI     Me     g! [         a  n[	        SX%5      eS nAff = f)NFUnhealthy databaser>   Tranger+   r   	Exceptionr   r   rA   )r   r1   r   health_checkattemptes         r   r4   HealthyAllPolicy.executeO   s    )L !9!9:X'44X>>$ ?
 5599$223 ; *  ! X45I8WWXs   A++
B5BBr   r    r!   r"   r#   r6   r8   r9   rB   r   r   r$   r4   r%   __classcell__rR   s   @r   rL   rL   G   s;    BC BU BT+%6 T  r   rL   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+   r/   c                 $   > [         TU ]  X5        g rE   rO   rQ   s      r   rB   HealthyMajorityPolicy.__init__b   rT   r   r1   r   c                    U H  nU R                   S-  S:X  a  U R                   S-  nOU R                   S-   S-  n[        U R                   5       HQ  n UR                  U5      (       d  US-  nUS::  a      gXPR                   S-
  :  d  M<  [        U R                  5        MS     M     g! [         a!  nUS-  nUS::  a  [	        SX&5      e S nANXS nAff = f)N   r   r>   FrV   T)r+   rX   r   rY   r   r   rA   )r   r1   r   rZ   allowed_unsuccessful_probesr[   r\   s          r   r4   HealthyMajorityPolicy.executee   s    )L''!+q0.2.F.F.J+/3/G/G!/Kq.P+ !9!9:
'44X>>3q836!;#( 5599$223 ; **  ! /14/2a780(  8s   !B**
C4CCr   r^   r`   s   @r   rb   rb   ]   s;    BC BU BT+%6 T  r   rb   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+   r/   c                 $   > [         TU ]  X5        g rE   rO   rQ   s      r   rB   HealthyAnyPolicy.__init__   rT   r   r1   r   c                 t   SnU H  nS n[        U R                  5       HJ  n UR                  U5      (       a  Sn  O0Sn X`R                  S-
  :  d  M5  [        U R                  5        ML     U(       d  U(       d  Us  $ U(       a  M  U(       d  M  Ue   U$ ! [         a  n[	        SX'5      n S nANrS nAff = f)NFTrV   r>   rW   )r   r1   r   
is_healthyrZ   	exceptionr[   r\   s           r   r4   HealthyAnyPolicy.execute   s    
)LI !9!9:	#00::%)
%*
 5599$223 ; i!!ZII+ *.  !  :,h!Is   BB
B7!B22B7r   r^   r`   s   @r   rk   rk   ~   s;    BC BU BT+%6 T  r   rk   c                        \ rS rSr\r\r\r	Sr
g)HealthCheckPolicies   r   N)r    r!   r"   r#   rL   HEALTHY_ALLrb   HEALTHY_MAJORITYrk   HEALTHY_ANYr%   r   r   r   rt   rt      s    "K,"Kr   rt   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                    [        UR                  [        5      (       a  UR                  R                  S5      $ UR                  R	                  5       nU H%  nUR
                  R                  S5      (       a  M%    g   g)NPINGFT)
isinstanceclientr   execute_command	get_nodesredis_connection)r   r   	all_nodesnodes       r   r   PingHealthCheck.check_health   se    hoou--??226:: !113I!,,<<VDD  " r   r   N)r    r!   r"   r#   r6   r$   r   r%   r   r   r   r{   r{      s    
 
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                 j    [        UU[        [        5       SS9UUUUU	U
US9
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   _http_client_rest_api_port_lag_aware_tolerance)r   r   r   r   r   r   r   r   r   r   r   r   s               r   rB   LagAwareHealthCheck.__init__   sG    @ '!	Q/!-+ 3
 ,$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                  l
        S nU R                  R                  S5       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  g)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%-" $$((4C,J'72#&L %V,D'* - - 5 NNUV<== U+, -??C?X?X>Y[ 	 	cu5 r   )r   r   r   )r    r!   r"   r#   r6   DEFAULT_LAG_AWARE_TOLERANCEr   r8   r9   r   r	   strr$   r
   bytesrB   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]-8^' 'r   r   )+loggingabcr   r   enumr   timer   typingr   r   r	   r
   redisr   redis.backoffr   redis.http.http_clientr   r   redis.multidb.exceptionr   redis.retryr   DEFAULT_HEALTH_CHECK_PROBESDEFAULT_HEALTH_CHECK_INTERVALDEFAULT_HEALTH_CHECK_DELAYr   	getLoggerr    r   r   r'   r;   rL   rb   rk   rt   rv   ry   __annotations__r{   r   r   r   r   <module>r      s     #   / /  # > >   !   " 			8	$#  . 1 (0 ,5 B"0 "J#$ # 4G3R3R 0 Rk $\+ \r   