
    keJiP(                        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&j'        Z(e&e)d<    G d de           Z* G d  d!e           Z+dS )"    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dS )HealthCheckreturnc                 
   K   dS )z(Function to determine the health status.N )selfdatabases     g/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/redis/asyncio/multidb/healthcheck.pycheck_healthzHealthCheck.check_health          	    N)__name__
__module____qualname__r   boolr   r   r   r   r   r      s9        d    ^  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                 
   K   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 4+< 4    ^  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__5   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                 
   K   d S r;   r   r,   s      r   r-   z!AbstractHealthCheckPolicy.executeC   s      r   N)r   r   r    r0   r1   r9   r/   r&   r)   r   r   r   r!   r-   r   r   r   r3   r3   4   s        6C 6U 6 6 6 6 )S ) ) ) X) (E ( ( ( X( 4+< 4    ^  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__M   %    ,.@AAAAAr   r*   r   c                 $  K   |D ]}t          | j                  D ]s}	 |                    |           d {V s  dS n## t          $ r}t	          d||          d }~ww xY w|| j        dz
  k     rt          j        | j                   d {V  tdS )NFUnhealthy databaser5   Tranger&   r   	Exceptionr   asynciosleepr8   )r   r*   r   health_checkattemptes         r   r-   zHealthyAllPolicy.executeP   s      ) 		B 		BL !9:: B BX!-!:!:8!D!DDDDDDD %$uuu%  X X X45I8UVWWWX T5999!-(@AAAAAAAAAB ts   >
AAAr   r   r    r.   r0   r1   r9   r   r   r!   r-   __classcell__rD   s   @r   r?   r?   H   s         BC BU B B B B B B4+< 4        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__c   rE   r   r*   r   c                   K   |D ]}| j         dz  dk    r| j         dz  }n| j         dz   dz  }t          | j                   D ]}	 |                    |           d {V 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        | j                   d {V  dS )N   r   r5   FrG   T)r&   rI   r   rJ   r   rK   rL   r8   )r   r*   r   rM   allowed_unsuccessful_probesrN   rO   s          r   r-   zHealthyMajorityPolicy.executef   s^     ) 	B 	BL'!+q00.2.F.J++/3/G!/Kq.P+ !9:: B B
!-!:!:8!D!DDDDDDD )3q836!;;#(555    /14/2a7780(A   87777 T5999!-(@AAAAAAAAAB ts   &A//
B9BBrP   rR   s   @r   rT   rT   ^   s         BC BU B B B B B B4+< 4        r   rT   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                 V  K   d}|D ]}d }t          | j                  D ]z}	 |                    |           d {V rd} nYd}n(# t          $ r}t	          d||          }Y d }~nd }~ww xY w|| j        dz
  k     rt          j        | j                   d {V  {|s|s|c S |s|r||S )NFTrG   r5   rH   )r   r*   r   
is_healthyrM   	exceptionrN   rO   s           r   r-   zHealthyAnyPolicy.execute   s)     
) 	  	 LI !9:: B B	)66x@@@@@@@@ +%)
%*

     :,h! !IIIIII
 T5999!-(@AAAAAAAAA  i  !!!!  I  s   AA
A)A$$A)rP   rR   s   @r   rZ   rZ      s         BC BU B B B B B B4+< 4        r   rZ   c                       e Zd ZeZeZeZdS )HealthCheckPoliciesN)	r   r   r    r?   HEALTHY_ALLrT   HEALTHY_MAJORITYrZ   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                    K   t          |j        t                    r |j                            d           d {V S |j                                        }|D ]%}|j                            d           d {V 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-- 		!88@@@@@@@@@ !1133I! ! !!2BB6JJJJJJJJ ! 55! 4r   N)r   r   r    r.   r!   r   r   r   r   rf   rf      s9         
d 
 
 
 
 
 
r   rf   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          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)
rt   ru   retryrv   rw   rx   ry   rz   r{   r|   N)r   r   r   r   _http_client_rest_api_port_lag_aware_tolerance)r   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   s               r   r9   zLagAwareHealthCheck.__init__   sp    @ 3%IKK333%!1 /$7  
 
 ,$7!!!r   r   c                   K   |j         t          d          t          |j        t                    r |j                                        d         }n|j        j        d         j        }|j          d| j         }|| j	        j        _
        d }| j	                            d           d {V 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 {V  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   ri   rj   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 ) *..z:::::::: 
	 
	C, 	 	J'722#&LE %V,  Dw'* ' NNUVVV<===[U+ [ [?C?X[ [ 	 ##CU#;;;;;;;;; tr   )r   r   r    r.   DEFAULT_LAG_AWARE_TOLERANCEr   r0   r1   r   r   strr!   r	   bytesr9   r   r   r   r   rq   rq      s         "#>(04!%!%/3*.)--1/8 /8/8 !/8 	/8
 U38_-/8 /8 #/8 #/8 %U
+,/8 #3-/8 "#/8 &c]/8 /8 /8 /8b'd ' ' ' ' ' 'r   rq   ),rK   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#   r3   r?   rT   rZ   r`   ra   rd   __annotations__rf   rq   r   r   r   <module>r      s     # # # # # # # #       / / / / / / / / / / / /       R R R R R R R R # # # # # # - - - - - - > > > > > >        !   " 		8	$	$    #          .     1   (    0   ,    5   B" " " " "0 " " "J# # # # #$ # # # 4G3R 0 R R R    k   $^ ^ ^ ^ ^+ ^ ^ ^ ^ ^r   