o
    Ljf&                     @   sr  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 d dlmZmZ d dlmZmZmZmZ d d	l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( d dl)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2m3Z3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9 dZ:G dd deZ;de0fddZ<eG dd dZ=eG dd dZ>dS )    )	dataclassfield)Enum)ListOptionalTypeUnionN)DEFAULT_RETRY_BASEDEFAULT_RETRY_CAPDEFAULT_RETRY_COUNT)ConnectionPoolRedisRedisCluster)Database	Databases)DEFAULT_FAILOVER_ATTEMPTSDEFAULT_FAILOVER_DELAYAsyncFailoverStrategyWeightBasedFailoverStrategy)AsyncFailureDetectorFailureDetectorAsyncWrapper)DEFAULT_HEALTH_CHECK_DELAYDEFAULT_HEALTH_CHECK_INTERVALDEFAULT_HEALTH_CHECK_POLICYDEFAULT_HEALTH_CHECK_PROBESDEFAULT_HEALTH_CHECK_TIMEOUTHealthCheckHealthCheckPoliciesPingHealthCheck)Retry)ExponentialWithJitterBackoff	NoBackoff)WeightedList)EventDispatcherEventDispatcherInterface)DEFAULT_GRACE_PERIODCircuitBreakerPBCircuitBreakerAdapter)DEFAULT_FAILURE_RATE_THRESHOLD!DEFAULT_FAILURES_DETECTION_WINDOWDEFAULT_MIN_NUM_FAILURESCommandFailureDetectorx   c                   @   s   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 r7   r7   Z/home/djax/ivt_ai_plugin/venv/lib/python3.10/site-packages/redis/asyncio/multidb/config.pyr-   1   s    r-   returnc                   C      t  S N)r#   r7   r7   r7   r8   default_event_dispatcher7      r<   c                   @   s   e Zd ZU dZdZeed< eed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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                 C   s   t j| jd}t|S )N)reset_timeout)	pybreakerr&   rF   r'   )selfcircuit_breakerr7   r7   r8   default_circuit_breaker]   s   z&DatabaseConfig.default_circuit_breaker)r1   r2   r3   __doc__r?   float__annotations__r   dictrB   rC   r   strrD   r   rE   r&   r%   rF   rG   rL   r7   r7   r7   r8   r>   ;   s   
 r>   c                   @   sn  e Zd ZU dZee ed< eZe	e
eef  ed< eeeede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< e0Z1eed< e2e3dZ4e5ed< e6j7Z8e6ed< de9fddZ:dee fddZ;dee fddZ<de+fd 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              	   C   s   t  }| jD ]Z}|jdtdt di |jr%| jj|jfi |j}n |jr<|j	tdt d | jj|jd}n	| jdi |j}|j
d u rN| n|j
}|t|||j|jd|j q|S )Nretryr   )rX   rW   )connection_pool)clientrE   r?   rG   r7   )r"   rS   rB   updater   r!   rC   rT   rD   	set_retryrE   rL   addr   r?   rG   )rJ   	databasesdatabase_configrl   rE   r7   r7   r8   rp      sB   


zMultiDbConfig.databasesc                 C   s   t t| j| j| jdgS )N)r[   r\   failure_detection_window)r   r+   r[   r\   r]   rJ   r7   r7   r8   default_failure_detectors   s   z'MultiDbConfig.default_failure_detectorsc                 C   s   t | j| j| jdgS )N)r`   ra   rb   )r   r`   ra   rb   rs   r7   r7   r8   default_health_checks   s   z#MultiDbConfig.default_health_checksc                 C   r:   r;   )r   rs   r7   r7   r8   default_failover_strategy   r=   z'MultiDbConfig.default_failover_strategy)>r1   r2   r3   rM   r   r>   rO   r   rT   r   r   r   r   r    r	   r
   r   rY   rZ   r   r   r*   r[   intr(   r\   rN   r)   r]   r^   r   r   r_   r   r`   r   ra   r   rb   r   rc   r   rd   r   r   re   r   rf   DEFAULT_AUTO_FALLBACK_INTERVALrg   r   r<   rh   r$   r-   r4   ri   r   rp   rt   ru   rv   r7   r7   r7   r8   rR   b   s@   
 +)	rR   )?dataclassesr   r   enumr   typingr   r   r   r   rI   redis._defaultsr	   r
   r   redis.asyncior   r   r   redis.asyncio.multidb.databaser   r   redis.asyncio.multidb.failoverr   r   r   r   &redis.asyncio.multidb.failure_detectorr   r   !redis.asyncio.multidb.healthcheckr   r   r   r   r   r   r   r   redis.asyncio.retryr   redis.backoffr    r!   redis.data_structurer"   redis.eventr#   r$   redis.multidb.circuitr%   r&   r'   redis.multidb.failure_detectorr(   r)   r*   r+   rx   r-   r<   r>   rR   r7   r7   r7   r8   <module>   s.    (
&