diff --git a/pybossa/sentinel/__init__.py b/pybossa/sentinel/__init__.py index 11101de37c..ac8200a4ef 100644 --- a/pybossa/sentinel/__init__.py +++ b/pybossa/sentinel/__init__.py @@ -31,10 +31,18 @@ def __init__(self, app=None): def init_app(self, app): socket_timeout = app.config.get('REDIS_SOCKET_TIMEOUT', None) retry_on_timeout = app.config.get('REDIS_RETRY_ON_TIMEOUT', True) - self.connection = sentinel.Sentinel(app.config['REDIS_SENTINEL'], - socket_timeout=socket_timeout, - retry_on_timeout=retry_on_timeout) - redis_db = app.config.get('REDIS_DB') or 0 - redis_master = app.config.get('REDIS_MASTER') or 'mymaster' - self.master = self.connection.master_for(redis_master, db=redis_db) - self.slave = self.connection.slave_for(redis_master, db=redis_db) + redis_db = app.config.get('REDIS_DB', 0) + redis_master = app.config.get('REDIS_MASTER', 'mymaster') + if app.config.get('REDIS_SENTINEL'): + self.connection = sentinel.Sentinel(app.config['REDIS_SENTINEL'], + socket_timeout=socket_timeout, + retry_on_timeout=retry_on_timeout) + self.master = self.connection.master_for(redis_master, db=redis_db) + self.slave = self.connection.slave_for(redis_master, db=redis_db) + else: + self.connection = None + self.master = StrictRedis(host=app.config.get('REDIS_HOST', 'localhost'), + port=app.config.get('REDIS_PORT', 6379), + db=redis_db, + password=app.config.get('REDIS_PASSWORD')) + self.slave = self.master diff --git a/test/test_sentinel.py b/test/test_sentinel.py new file mode 100644 index 0000000000..76a2fae8bb --- /dev/null +++ b/test/test_sentinel.py @@ -0,0 +1,53 @@ +# -*- coding: utf8 -*- +# This file is part of PYBOSSA. +# +# Copyright (C) 2021 Scifabric LTD. +# +# PYBOSSA is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# PYBOSSA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with PYBOSSA. If not, see . +from mock import patch +from default import with_context, Test +from pybossa.extensions import Sentinel + + +class TestSentinel(Test): + + @with_context + def test_is_configured(self): + """Test sentinel is configured.""" + sentinel = Sentinel() + sentinel.init_app(self.flask_app) + assert sentinel.connection is not None + assert sentinel.connection + # We get the redis-client for mymaster + redis_client = sentinel.connection.master_for('mymaster') + redis_client.set('foo', 'bar') + assert redis_client.get('foo') == b'bar' + assert sentinel.master.get('foo') == b'bar' + assert sentinel.slave.get('foo') == b'bar' + sentinel.master.delete('foo') + assert redis_client.get('foo') is None + + @with_context + def test_is_not_configured(self): + """Test sentinel is not configured.""" + sentinel = Sentinel() + with patch.dict(self.flask_app.config, {'REDIS_SENTINEL': None}): + sentinel.init_app(self.flask_app) + assert sentinel.connection is None + assert sentinel.master.set('foo', 'bar') + assert sentinel.master.get('foo') == b'bar' + assert sentinel.slave.get('foo') == b'bar' + sentinel.master.delete('foo') + assert sentinel.master.get('foo') is None + assert sentinel.slave.get('foo') is None