Skip to content

Commit

Permalink
Merge pull request Kinto#461 from mozilla-services/386-no-backend-by-…
Browse files Browse the repository at this point in the history
…default

Do not instantiate backends if not configured (fixes Kinto#386)
  • Loading branch information
Natim committed Sep 23, 2015
2 parents bf0c973 + 7b2adda commit 036fbde
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 19 deletions.
6 changes: 3 additions & 3 deletions cliquet/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
DEFAULT_SETTINGS = {
'cliquet.backoff': None,
'cliquet.batch_max_requests': 25,
'cliquet.cache_backend': 'cliquet.cache.redis',
'cliquet.cache_backend': '',
'cliquet.cache_pool_size': 10,
'cliquet.cache_url': '',
'cliquet.cors_origins': '*',
Expand Down Expand Up @@ -58,7 +58,7 @@
'cliquet.newrelic_config': None,
'cliquet.newrelic_env': 'dev',
'cliquet.paginate_by': None,
'cliquet.permission_backend': 'cliquet.permission.redis',
'cliquet.permission_backend': '',
'cliquet.permission_url': '',
'cliquet.permission_pool_size': 10,
'cliquet.profiler_dir': '/tmp',
Expand All @@ -69,7 +69,7 @@
'cliquet.retry_after_seconds': 30,
'cliquet.statsd_prefix': 'cliquet',
'cliquet.statsd_url': None,
'cliquet.storage_backend': 'cliquet.storage.redis',
'cliquet.storage_backend': '',
'cliquet.storage_max_fetch_size': 10000,
'cliquet.storage_pool_size': 10,
'cliquet.storage_url': '',
Expand Down
18 changes: 15 additions & 3 deletions cliquet/initialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,11 @@ def eos_tween(request):

def setup_storage(config):
settings = config.get_settings()
storage = config.maybe_dotted(settings['cliquet.storage_backend'])
storage_class = settings['cliquet.storage_backend']
if not storage_class:
return

storage = config.maybe_dotted(storage_class)
config.registry.storage = storage.load_from_config(config)
config.registry.heartbeats['storage'] = config.registry.storage.ping
id_generator = config.maybe_dotted(settings['cliquet.id_generator'])
Expand All @@ -219,14 +223,22 @@ def setup_storage(config):

def setup_permission(config):
settings = config.get_settings()
permission = config.maybe_dotted(settings['cliquet.permission_backend'])
permission_class = settings['cliquet.permission_backend']
if not permission_class:
return

permission = config.maybe_dotted(permission_class)
config.registry.permission = permission.load_from_config(config)
config.registry.heartbeats['permission'] = config.registry.permission.ping


def setup_cache(config):
settings = config.get_settings()
cache = config.maybe_dotted(settings['cliquet.cache_backend'])
cache_class = settings['cliquet.cache_backend']
if not cache_class:
return

cache = config.maybe_dotted(cache_class)
config.registry.cache = cache.load_from_config(config)
config.registry.heartbeats['cache'] = config.registry.cache.ping

Expand Down
11 changes: 4 additions & 7 deletions cliquet/scripts/cliquet.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,11 @@ def deprecated_init(env):


def init_schema(env):
cache_backend = env['registry'].cache
cache_backend.initialize_schema()
registry = env['registry']

storage_backend = env['registry'].storage
storage_backend.initialize_schema()

permission_backend = env['registry'].permission
permission_backend.initialize_schema()
for backend in ('cache', 'storage', 'permission'):
if hasattr(registry, backend):
getattr(registry, backend).initialize_schema()


def main():
Expand Down
2 changes: 2 additions & 0 deletions cliquet/tests/resource/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ def __init__(self, *args, **kwargs):

self.config.add_settings({
'cliquet.storage_backend': 'cliquet.storage.memory',
'cliquet.cache_backend': 'cliquet.cache.memory',
'cliquet.permission_backend': 'cliquet.permission.memory',
'cliquet.project_version': '0.0.1',
'cliquet.project_name': 'cliquet',
'cliquet.project_docs': 'https://cliquet.rtfd.org/',
Expand Down
5 changes: 5 additions & 0 deletions cliquet/tests/support.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,11 @@ def _get_test_app(self, settings=None):

def get_app_settings(self, additional_settings=None):
settings = DEFAULT_SETTINGS.copy()

settings['cliquet.storage_backend'] = 'cliquet.storage.redis'
settings['cliquet.cache_backend'] = 'cliquet.cache.redis'
settings['cliquet.permission_backend'] = 'cliquet.permission.redis'

settings['cliquet.project_name'] = 'cliquet'
settings['cliquet.project_docs'] = 'https://cliquet.rtfd.org/'
settings['multiauth.authorization_policy'] = (
Expand Down
7 changes: 7 additions & 0 deletions cliquet/tests/test_initialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,13 @@ def test_specified_default_settings_are_overriden_by_application(self):
default_settings=defaults)
self.assertEqual(config.registry.settings['cliquet.paginate_by'], 5)

def test_backend_are_not_instantiated_by_default(self):
config = Configurator(settings=cliquet.DEFAULT_SETTINGS)
cliquet.initialize(config, '0.0.1', 'project_name')
self.assertFalse(hasattr(config.registry, 'storage'))
self.assertFalse(hasattr(config.registry, 'cache'))
self.assertFalse(hasattr(config.registry, 'permission'))

def test_environment_values_override_configuration(self):
import os

Expand Down
24 changes: 18 additions & 6 deletions cliquet/tests/test_scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,24 @@


class InitSchemaTest(unittest.TestCase):
def test_init_schema_calls_initialize_schema_on_cache_and_storage(self):
fakeregistry = mock.MagicMock()
def setUp(self):
self.registry = mock.MagicMock()

def run_command(self, command):
with mock.patch('cliquet.scripts.cliquet.bootstrap') as mocked:
mocked.return_value = {'registry': fakeregistry}
mocked.return_value = {'registry': self.registry}
with mock.patch('cliquet.scripts.cliquet.sys') as sys_mocked:
sys_mocked.argv = ['prog', '--ini', 'foo.ini', 'init']
sys_mocked.argv = ['prog', '--ini', 'foo.ini', command]
cliquet_script.main()
self.assertTrue(fakeregistry.storage.initialize_schema.called)
self.assertTrue(fakeregistry.cache.initialize_schema.called)

def test_deprecated_init_command_is_supported(self):
self.run_command('init')
self.assertTrue(self.registry.storage.initialize_schema.called)
self.assertTrue(self.registry.cache.initialize_schema.called)
self.assertTrue(self.registry.permission.initialize_schema.called)

def test_migrate_calls_initialize_schema_on_backends(self):
self.run_command('migrate')
self.assertTrue(self.registry.storage.initialize_schema.called)
self.assertTrue(self.registry.cache.initialize_schema.called)
self.assertTrue(self.registry.permission.initialize_schema.called)

0 comments on commit 036fbde

Please sign in to comment.