# common/utils/cache/regions.py import time from dogpile.cache import make_region from urllib.parse import urlparse def get_redis_config(app): """ Create Redis configuration dict based on app config. Handles both authenticated and non-authenticated setups. """ # Parse the REDIS_BASE_URI to get all components redis_uri = urlparse(app.config['REDIS_BASE_URI']) config = { 'host': redis_uri.hostname, 'port': int(redis_uri.port or 6379), 'db': 0, 'redis_expiration_time': 3600, 'distributed_lock': True, 'thread_local_lock': False, # Built-in connection pooling parameters 'connection_pool_class': 'redis.BlockingConnectionPool', 'connection_pool_class_kwargs': { 'max_connections': 20, 'timeout': 20, 'retry_on_timeout': True, 'socket_connect_timeout': 5, 'socket_timeout': 5, }, # Key prefix for namespace isolation 'key_mangler': lambda key: f"cache:workers:{key}" } # Add authentication if provided if redis_uri.username and redis_uri.password: config.update({ 'username': redis_uri.username, 'password': redis_uri.password }) # SSL support using centralised config cert_path = app.config.get('REDIS_CA_CERT_PATH') if cert_path and redis_uri.scheme == 'rediss': import ssl # Create SSL context ssl_context = ssl.create_default_context() ssl_context.load_verify_locations(cert_path) ssl_context.verify_mode = ssl.CERT_REQUIRED ssl_context.check_hostname = app.config.get('REDIS_SSL_CHECK_HOSTNAME', True) # Add SSL to connection pool kwargs (correct for redis-py) config['connection_pool_class_kwargs']['ssl'] = True config['connection_pool_class_kwargs']['ssl_cert_reqs'] = ssl.CERT_REQUIRED config['connection_pool_class_kwargs']['ssl_ca_certs'] = cert_path config['connection_pool_class_kwargs']['ssl_check_hostname'] = app.config.get('REDIS_SSL_CHECK_HOSTNAME', True) # Also pass explicit context (preferred when available) config['connection_pool_class_kwargs']['ssl_context'] = ssl_context return config def create_cache_regions(app): """Initialise all cache regions with app config""" redis_config = get_redis_config(app) regions = {} startup_time = int(time.time()) # Region for model-related caching (ModelVariables etc) model_region = make_region(name='eveai_model').configure( 'dogpile.cache.redis', arguments=redis_config, replace_existing_backend=True ) regions['eveai_model'] = model_region # Region for eveai_chat_workers components (Specialists, Retrievers, ...) eveai_chat_workers_region = make_region(name='eveai_chat_workers').configure( 'dogpile.cache.redis', arguments=redis_config, replace_existing_backend=True ) regions['eveai_chat_workers'] = eveai_chat_workers_region # Region for eveai_workers components (Processors, ...) eveai_workers_region = make_region(name='eveai_workers').configure( 'dogpile.cache.redis', arguments=redis_config, # Same config for now replace_existing_backend=True ) regions['eveai_workers'] = eveai_workers_region eveai_config_region = make_region(name='eveai_config').configure( 'dogpile.cache.redis', arguments=redis_config, replace_existing_backend=True ) regions['eveai_config'] = eveai_config_region return regions