
    i&                        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
Z
d dlmZmZmZ d dlmZmZmZmZmZmZmZmZ d dl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#m$Z$m%Z% d dl&m'Z'm(Z( d dl)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 dZ6 G d de          Z7defdZ8e G d d                      Z9e G d d                      Z:dS )    )	dataclassfield)Enum)ListOptionalTypeUnionN)ConnectionPoolRedisRedisCluster)DEFAULT_HEALTH_CHECK_DELAYDEFAULT_HEALTH_CHECK_INTERVALDEFAULT_HEALTH_CHECK_POLICYDEFAULT_HEALTH_CHECK_PROBESDEFAULT_HEALTH_CHECK_TIMEOUTHealthCheckHealthCheckPoliciesPingHealthCheck)ExponentialWithJitterBackoff	NoBackoff)WeightedList)EventDispatcherEventDispatcherInterface)MaintNotificationsConfig)DEFAULT_GRACE_PERIODCircuitBreakerPBCircuitBreakerAdapter)Database	Databases)DEFAULT_FAILOVER_ATTEMPTSDEFAULT_FAILOVER_DELAYFailoverStrategyWeightBasedFailoverStrategy)DEFAULT_FAILURE_RATE_THRESHOLD!DEFAULT_FAILURES_DETECTION_WINDOWDEFAULT_MIN_NUM_FAILURESCommandFailureDetectorFailureDetector)Retryx   c                       e Zd ZdZdZdZdS )InitialHealthCheckall_availablemajority_availableone_availableN)__name__
__module____qualname__ALL_AVAILABLEMAJORITY_AVAILABLEONE_AVAILABLE     f/Users/user/workspace/sujinbaek/cqa-test-app/venv/lib/python3.11/site-packages/redis/multidb/config.pyr,   r,   .   s        #M-#MMMr7   r,   returnc                      t                      S N)r   r6   r7   r8   default_event_dispatcherr<   4   s    r7   c                       e Zd ZU dZdZeed<    ee          Z	eed<   dZ
ee         ed<   dZee         ed<   dZee         ed	<   eZeed
<   dZee         ed<   defdZdS )DatabaseConfiga  
    Dataclass representing the configuration for a database connection.

    This class is used to store configuration settings for a database connection,
    including client options, connection sourcing details, circuit breaker settings,
    and cluster-specific properties. It provides a structure for defining these
    attributes and allows for the creation of customized configurations for various
    database setups.

    Attributes:
        weight (float): Weight of the database to define the active one.
        client_kwargs (dict): Additional parameters for the database client connection.
        from_url (Optional[str]): Redis URL way of connecting to the database.
        from_pool (Optional[ConnectionPool]): A pre-configured connection pool to use.
        circuit (Optional[CircuitBreaker]): Custom circuit breaker implementation.
        grace_period (float): Grace period after which we need to check if the circuit could be closed again.
        health_check_url (Optional[str]): URL for health checks. Cluster FQDN is typically used
            on public Redis Enterprise endpoints.

    Methods:
        default_circuit_breaker:
            Generates and returns a default CircuitBreaker instance adapted for use.
    g      ?weightdefault_factoryclient_kwargsNfrom_url	from_poolcircuitgrace_periodhealth_check_urlr9   c                 T    t          j        | j                  }t          |          S )N)reset_timeout)	pybreakerr   rF   r   )selfcircuit_breakers     r8   default_circuit_breakerz&DatabaseConfig.default_circuit_breakerZ   s&    #2ARSSS&777r7   )r0   r1   r2   __doc__r?   float__annotations__r   dictrB   rC   r   strrD   r
   rE   r   r   rF   rG   rM   r6   r7   r8   r>   r>   8   s          0 FE%555M4555"Hhsm"""*.Ix'...(,GXn%,,,.L%...&*hsm***8 8 8 8 8 8 8r7   r>   c                      e Zd ZU dZee         ed<   eZe	e
eef                  ed<    e edd          d          Zeed	<   d
Zeee                  ed<   eZeed<   eZeed<   eZeed<   d
Zeee                  ed<   eZeed<   eZeed<   e Z!eed<   e"Z#eed<   e$Z%e&ed<   d
Z'ee(         ed<   e)Z*eed<   e+Z,eed<   e-Z.eed<    e/e0          Z1e2ed<   e3j4        Z5e3ed<   de6fdZ7dee         fdZ8dee         fdZ9de(fd Z:d
S )!MultiDbConfiga	  
    Configuration class for managing multiple database connections in a resilient and fail-safe manner.

    Attributes:
        databases_config: A list of database configurations.
        client_class: The client class used to manage database connections.
        command_retry: Retry strategy for executing database commands.
        failure_detectors: Optional list of additional failure detectors for monitoring database failures.
        min_num_failures: Minimal count of failures required for failover
        failure_rate_threshold: Percentage of failures required for failover
        failures_detection_window: Time interval for tracking database failures.
        health_checks: Optional list of additional health checks performed on databases.
        health_check_interval: Time interval for executing health checks.
        health_check_probes: Number of attempts to evaluate the health of a database.
        health_check_delay: Delay between health check attempts.
        health_check_timeout: Timeout for the full health check operation (including all probes).
        health_check_policy: Policy for determining database health based on health checks.
        failover_strategy: Optional strategy for handling database failover scenarios.
        failover_attempts: Number of retries allowed for failover operations.
        failover_delay: Delay between failover attempts.
        auto_fallback_interval: Time interval to trigger automatic fallback.
        event_dispatcher: Interface for dispatching events related to database operations.
        initial_health_check_policy: Defines the policy used to determine whether the databases setup is
                                     healthy during the initial health check.

    Methods:
        databases:
            Retrieves a collection of database clients managed by weighted configurations.
            Initializes database clients based on the provided configuration and removes
            redundant retry objects for lower-level clients to rely on global retry logic.

        default_failure_detectors:
            Returns the default list of failure detectors used to monitor database failures.

        default_health_checks:
            Returns the default list of health checks used to monitor database health
            with specific retry and backoff strategies.

        default_failover_strategy:
            Provides the default failover strategy used for handling failover scenarios
            with defined retry and backoff configurations.
    databases_configclient_class   
   )basecap   )backoffretriescommand_retryNfailure_detectorsmin_num_failuresfailure_rate_thresholdfailures_detection_windowhealth_checkshealth_check_intervalhealth_check_probeshealth_check_delayhealth_check_timeouthealth_check_policyfailover_strategyfailover_attemptsfailover_delayauto_fallback_intervalr@   event_dispatcherinitial_health_check_policyr9   c           	         t                      }| j        D ]5}t          dt                                |j        d<   d|j        vrt          d          |j        d<   |j        r | j        j        |j        fi |j        }no|j        rV|j        	                    t          dt                                           | j                            |j                  }n | j        d	i |j        }|j
        |                                n|j
        }|                    t          |||j        |j                  |j                   7|S )
Nr   )r]   r\   retrymaint_notifications_configF)enabled)connection_pool)clientrE   r?   rG   r6   )r   rU   r)   r   rB   r   rC   rV   rD   	set_retryrE   rM   addr   r?   rG   )rK   	databasesdatabase_configrt   rE   s        r8   rw   zMultiDbConfig.databases   s    NN	#4 )	 )	O 6;9;;6 6 6O)'2 ,?3PPP,U;;;  -.JK ' L3*3#, 0?0M  !* L)33!Y[[999   *44$3$= 5   +*KK_-JKK #*2  77999$, 
 MM!#*1%4%E	    &    r7   c                 F    t          | j        | j        | j                  gS )N)r`   ra   failure_detection_window)r'   r`   ra   rb   rK   s    r8   default_failure_detectorsz'MultiDbConfig.default_failure_detectors   s0    "!%!6'+'B)-)G  
 	
r7   c                 F    t          | j        | j        | j                  gS )N)re   rf   rg   )r   re   rf   rg   r{   s    r8   default_health_checksz#MultiDbConfig.default_health_checks   s0    $($<#'#:%)%>  
 	
r7   c                     t                      S r;   )r#   r{   s    r8   default_failover_strategyz'MultiDbConfig.default_failover_strategy   s    *,,,r7   );r0   r1   r2   rN   r   r>   rP   r   rV   r   r	   r   r)   r   r^   r_   r   r(   r&   r`   intr$   ra   rO   r%   rb   rc   r   r   rd   r   re   r   rf   r   rg   r   rh   r   ri   r"   r    rj   r!   rk   DEFAULT_AUTO_FALLBACK_INTERVALrl   r   r<   rm   r   r,   r3   rn   r   rw   r|   r~   r   r6   r7   r8   rT   rT   _   sT        ) )V >****5:L$uUL012::: 5,,!<<<a  M5    :>x_ 56===4c444$BEBBB'HuHHH15M8D-.555#@5@@@:::: ::::">%>>>/J,JJJ48x 018886s6662NE222$BEBBB1602 2 2.    7I6V!3VVV.9 . . . .`
4+@ 
 
 
 

tK'8 
 
 
 
-+; - - - - - -r7   rT   );dataclassesr   r   enumr   typingr   r   r   r	   rJ   redisr
   r   r   !redis.asyncio.multidb.healthcheckr   r   r   r   r   r   r   r   redis.backoffr   r   redis.data_structurer   redis.eventr   r   redis.maint_notificationsr   redis.multidb.circuitr   r   r   redis.multidb.databaser   r   redis.multidb.failoverr    r!   r"   r#   redis.multidb.failure_detectorr$   r%   r&   r'   r(   redis.retryr)   r   r,   r<   r>   rT   r6   r7   r8   <module>r      s   ( ( ( ( ( ( ( (       . . . . . . . . . . . .     5 5 5 5 5 5 5 5 5 5	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 B A A A A A A A - - - - - - A A A A A A A A > > > > > >         
 7 6 6 6 6 6 6 6                              !$ $ $ $ $ $ $ $ $":     #8 #8 #8 #8 #8 #8 #8 #8L G- G- G- G- G- G- G- G- G- G-r7   