
    keJi)'                        U d dl Z d dlmZ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 d dlmZ d dlmZ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%j&        Z'e%e(d<    G d de          Z) G d  d!e          Z*dS )"    N)ABCabstractmethod)Enum)sleep)ListOptionalTupleUnion)Redis)	NoBackoff)DEFAULT_TIMEOUT
HttpClient)UnhealthyDatabaseException)Retry      g      ?i  c                   *    e Zd Zedefd            ZdS )HealthCheckreturnc                     dS )z(Function to determine the health status.N )selfdatabases     _/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/redis/multidb/healthcheck.pycheck_healthzHealthCheck.check_health   	     	    N)__name__
__module____qualname__r   boolr   r   r   r   r   r      s9            ^  r   r   c                       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dS )HealthCheckPolicyz)
    Health checks execution policy.
    r   c                     dS )z*Number of probes to execute health checks.Nr   r   s    r   health_check_probesz%HealthCheckPolicy.health_check_probes!   	     	r   c                     dS )z"Delay between health check probes.Nr   r%   s    r   health_check_delayz$HealthCheckPolicy.health_check_delay'   r'   r   health_checksc                     dS )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#      s          S    ^ X E    ^ X T+%6 T    ^  r   r#   c                       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d	S )
AbstractHealthCheckPolicyr&   r)   c                 L    |dk     rt          d          || _        || _        d S )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__4   s2    ""IJJJ$7!#5   r   r   c                     | j         S N)r7   r%   s    r   r&   z-AbstractHealthCheckPolicy.health_check_probes:   s    ((r   c                     | j         S r;   )r8   r%   s    r   r)   z,AbstractHealthCheckPolicy.health_check_delay>   s    ''r   r*   c                     d S r;   r   r,   s      r   r-   z!AbstractHealthCheckPolicy.executeB   s    r   N)r   r   r    r0   r1   r9   r/   r&   r)   r   r   r   r!   r-   r   r   r   r3   r3   3   s        6C 6U 6 6 6 6 )S ) ) ) X) (E ( ( ( X( T+%6 T    ^  r   r3   c                   H     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                 L    t                                          ||           d S r;   superr9   r   r&   r)   	__class__s      r   r9   zHealthyAllPolicy.__init__L   %    ,.@AAAAAr   r*   r   c                     |D ]y}t          | j                  D ]b}	 |                    |          s  dS n## t          $ r}t	          d||          d }~ww xY w|| j        dz
  k     rt          | j                   czdS )NFUnhealthy databaser5   Tranger&   r   	Exceptionr   r   r8   )r   r*   r   health_checkattemptes         r   r-   zHealthyAllPolicy.executeO   s    ) 		4 		4L !9:: 4 4X'44X>> %$uuu%  X X X45I8UVWWWX T5999$23334 ts   6
A AAr   r   r    r.   r0   r1   r9   r   r   r!   r-   __classcell__rD   s   @r   r?   r?   G   s         BC BU B B B B B BT+%6 T        r   r?   c                   H     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                 L    t                                          ||           d S r;   rA   rC   s      r   r9   zHealthyMajorityPolicy.__init__b   rE   r   r*   r   c                    |D ]}| j         dz  dk    r| j         dz  }n| j         dz   dz  }t          | j                   D ]}}	 |                    |          s|dz  }|dk    r  dS n3# t          $ r&}|dz  }|dk    rt	          d||          Y d }~nd }~ww xY w|| j         dz
  k     rt          | j                   ~dS )N   r   r5   FrG   T)r&   rI   r   rJ   r   r   r8   )r   r*   r   rK   allowed_unsuccessful_probesrL   rM   s          r   r-   zHealthyMajorityPolicy.executee   s/   ) 	4 	4L'!+q00.2.F.J++/3/G!/Kq.P+ !9:: 4 4
'44X>> )3q836!;;#(555    /14/2a7780(A   87777 T5999$23334 ts    A''
B1BBrN   rP   s   @r   rR   rR   ]   s         BC BU B B B B B BT+%6 T        r   rR   c                   H     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                 L    t                                          ||           d S r;   rA   rC   s      r   r9   zHealthyAnyPolicy.__init__   rE   r   r*   r   c                 0   d}|D ]}d }t          | j                  D ]i}	 |                    |          rd} nNd}n(# t          $ r}t	          d||          }Y d }~nd }~ww xY w|| j        dz
  k     rt          | j                   j|s|s|c S |s|r||S )NFTrG   r5   rH   )r   r*   r   
is_healthyrK   	exceptionrL   rM   s           r   r-   zHealthyAnyPolicy.execute   s    
) 	  	 LI !9:: 4 4	#00:: +%)
%*

     :,h! !IIIIII
 T5999$2333  i  !!!!  I  s   <<
A!AA!rN   rP   s   @r   rX   rX   ~   s         BC BU B B B B B BT+%6 T        r   rX   c                       e Zd ZeZeZeZdS )HealthCheckPoliciesN)	r   r   r    r?   HEALTHY_ALLrR   HEALTHY_MAJORITYrX   HEALTHY_ANYr   r   r   r^   r^      s        "K,"KKKr   r^   DEFAULT_HEALTH_CHECK_POLICYc                       e Zd ZdZdefdZdS )PingHealthCheckz-
    Health check based on PING command.
    r   c                     t          |j        t                    r|j                            d          S |j                                        }|D ]}|j                            d          s dS  dS )NPINGFT)
isinstanceclientr   execute_command	get_nodesredis_connection)r   r   	all_nodesnodes       r   r   zPingHealthCheck.check_health   s|    hou-- 		?226::: !1133I! ! !,<<VDD ! 55! 4r   N)r   r   r    r.   r!   r   r   r   r   rd   rd      s9         
 
 
 
 
 
 
r   rd   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dS )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                      d          |||||	|
|
  
        | _        || _        || _        dS )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)
rr   rs   retryrt   ru   rv   rw   rx   ry   rz   N)r   r   r   _http_client_rest_api_port_lag_aware_tolerance)r   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   s               r   r9   zLagAwareHealthCheck.__init__   sc    @ '!	Q///!-+ 3
 
 
 ,$7!!!r   r   c                 `   |j         t          d          t          |j        t                    r |j                                        d         }n|j        j        d         j        }|j          d| j         }|| j	        _
        d }| j	                            d          D ]2}|d         D ]'}|d         |k    r|} n|d         D ]}||k    r|} n(3|)t                              d	           t          d
          d|d          d| j         }| j	                            |d           dS )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_urlr6   rg   rh   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   hou-- 	<o;;==fEGGo3A6;G/GG$2EGG%-" $((44 
	 
	C, 	 	J'722#&LE %V,  Dw'* ' NNUVVV<===[U+ [ [?C?X[ [ 	 	cu555 tr   )r   r   r    r.   DEFAULT_LAG_AWARE_TOLERANCEr   r0   r1   r   r	   strr!   r
   bytesr9   r   r   r   r   ro   ro      s         "#>(04!%!%/3*.)--1-8 -8-8 !-8 	-8
 U38_--8 -8 #-8 #-8 %U
+,-8 #3--8 "#-8 &c]-8 -8 -8 -8^' ' ' ' ' ' 'r   ro   )+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#   r3   r?   rR   rX   r^   r_   rb   __annotations__rd   ro   r   r   r   <module>r      s    # # # # # # # #             / / / / / / / / / / / /       # # # # # # > > > > > > > > > > > > > >        !   " 		8	$	$    #          .     1   (    0   ,    5   B" " " " "0 " " "J# # # # #$ # # # 4G3R 0 R R R    k   $\ \ \ \ \+ \ \ \ \ \r   