Merge pull request #11 from guewen/10.0-session-redis-sentinel

[10.0] Allow to use a Redis Sentinel
This commit is contained in:
Guewen Baconnier
2017-05-18 16:40:25 +02:00
committed by GitHub
co-authored by GitHub
2 changed files with 31 additions and 8 deletions
+4 -3
View File
@@ -116,9 +116,10 @@ class CloudPlatform(models.AbstractModel):
"Redis must be activated on prod, integration, test instances." "Redis must be activated on prod, integration, test instances."
"This is done by setting ODOO_SESSION_REDIS=1." "This is done by setting ODOO_SESSION_REDIS=1."
) )
assert os.environ.get('ODOO_SESSION_REDIS_HOST'), ( assert (os.environ.get('ODOO_SESSION_REDIS_HOST') or
"ODOO_SESSION_REDIS_HOST environment variable is required " os.environ.get('ODOO_SESSION_REDIS_SENTINEL_HOST')), (
"to connect on Redis" "ODOO_SESSION_REDIS_HOST or ODOO_SESSION_REDIS_SENTINEL_HOST "
"environment variable is required to connect on Redis"
) )
assert os.environ.get('ODOO_SESSION_REDIS_PREFIX'), ( assert os.environ.get('ODOO_SESSION_REDIS_PREFIX'), (
"ODOO_SESSION_REDIS_PREFIX environment variable is required " "ODOO_SESSION_REDIS_PREFIX environment variable is required "
+26 -4
View File
@@ -17,6 +17,7 @@ _logger = logging.getLogger(__name__)
try: try:
import redis import redis
from redis.sentinel import Sentinel
except ImportError: except ImportError:
redis = None # noqa redis = None # noqa
_logger.debug("Cannot 'import redis'.") _logger.debug("Cannot 'import redis'.")
@@ -26,8 +27,18 @@ def is_true(strval):
return bool(strtobool(strval or '0'.lower())) return bool(strtobool(strval or '0'.lower()))
host = os.environ.get('ODOO_SESSION_REDIS_HOST') or 'localhost' sentinel_host = os.environ.get('ODOO_SESSION_REDIS_SENTINEL_HOST')
port = int(os.environ.get('ODOO_SESSION_REDIS_PORT') or 6379) sentinel_master_name = os.environ.get(
'ODOO_SESSION_REDIS_SENTINEL_MASTER_NAME'
)
if sentinel_host and not sentinel_master_name:
raise Exception(
"ODOO_SESSION_REDIS_SENTINEL_MASTER_NAME must be defined "
"when using session_redis"
)
sentinel_port = int(os.environ.get('ODOO_SESSION_REDIS_SENTINEL_PORT', 26379))
host = os.environ.get('ODOO_SESSION_REDIS_HOST', 'localhost')
port = int(os.environ.get('ODOO_SESSION_REDIS_PORT', 6379))
prefix = os.environ.get('ODOO_SESSION_REDIS_PREFIX') prefix = os.environ.get('ODOO_SESSION_REDIS_PREFIX')
password = os.environ.get('ODOO_SESSION_REDIS_PASSWORD') password = os.environ.get('ODOO_SESSION_REDIS_PASSWORD')
expiration = os.environ.get('ODOO_SESSION_REDIS_EXPIRATION') expiration = os.environ.get('ODOO_SESSION_REDIS_EXPIRATION')
@@ -35,6 +46,11 @@ expiration = os.environ.get('ODOO_SESSION_REDIS_EXPIRATION')
@lazy_property @lazy_property
def session_store(self): def session_store(self):
if sentinel_host:
sentinel = Sentinel([(sentinel_host, sentinel_port)],
password=password)
redis_client = sentinel.master_for(sentinel_master_name)
else:
redis_client = redis.Redis(host=host, port=port, password=password) redis_client = redis.Redis(host=host, port=port, password=password)
return RedisSessionStore(redis=redis_client, prefix=prefix, return RedisSessionStore(redis=redis_client, prefix=prefix,
expiration=expiration, expiration=expiration,
@@ -60,8 +76,14 @@ def purge_fs_sessions(path):
if is_true(os.environ.get('ODOO_SESSION_REDIS')): if is_true(os.environ.get('ODOO_SESSION_REDIS')):
_logger.debug("HTTP sessions stored in Redis %s:%s with prefix '%s'", if sentinel_host:
host, port, prefix or '') _logger.debug("HTTP sessions stored in Redis with prefix '%s'. "
"Using Sentinel on %s:%s",
sentinel_host, sentinel_port, prefix or '')
else:
_logger.debug("HTTP sessions stored in Redis with prefix '%s' on "
"%s:%s", host, port, prefix or '')
http.Root.session_store = session_store http.Root.session_store = session_store
http.session_gc = session_gc http.session_gc = session_gc
# clean the existing sessions on the file system # clean the existing sessions on the file system