redis: Make database id configurable

Add the new option to select the database id so that users can use
non-default databases.

Change-Id: Ifa09b7ef5e47ec396b46f2db1a27016545e07b45
This commit is contained in:
Takashi Kajinami
2024-06-16 12:35:17 +09:00
parent bb468f21bf
commit 48dbe7808f
4 changed files with 123 additions and 17 deletions

View File

@@ -130,6 +130,10 @@ FILE_OPTIONS = {
cfg.StrOpt('redis_server', cfg.StrOpt('redis_server',
default='localhost:6379', default='localhost:6379',
help='Redis server in the format of "host:port"'), help='Redis server in the format of "host:port"'),
cfg.IntOpt('redis_db',
default=0,
min=0,
help='Database id in Redis server'),
cfg.StrOpt('redis_username', cfg.StrOpt('redis_username',
help='the user name for redis'), help='the user name for redis'),
cfg.StrOpt('redis_password', cfg.StrOpt('redis_password',

View File

@@ -166,7 +166,8 @@ def _build_cache_config(conf):
parts = urllib.parse.ParseResult( parts = urllib.parse.ParseResult(
scheme=('rediss' if conf.cache.tls_enabled else 'redis'), scheme=('rediss' if conf.cache.tls_enabled else 'redis'),
netloc=netloc, path='', params='', query='', fragment='') netloc=netloc, path=str(conf.cache.redis_db), params='', query='',
fragment='')
conf_dict.setdefault( conf_dict.setdefault(
f'{prefix}.arguments.url', f'{prefix}.arguments.url',
@@ -176,7 +177,7 @@ def _build_cache_config(conf):
value = getattr(conf.cache, 'redis_' + arg) value = getattr(conf.cache, 'redis_' + arg)
conf_dict[f'{prefix}.arguments.{arg}'] = value conf_dict[f'{prefix}.arguments.{arg}'] = value
elif conf.cache.backend == 'dogpile.cache.redis_sentinel': elif conf.cache.backend == 'dogpile.cache.redis_sentinel':
for arg in ('username', 'password', 'socket_timeout'): for arg in ('username', 'password', 'socket_timeout', 'db'):
value = getattr(conf.cache, 'redis_' + arg) value = getattr(conf.cache, 'redis_' + arg)
conf_dict[f'{prefix}.arguments.{arg}'] = value conf_dict[f'{prefix}.arguments.{arg}'] = value
conf_dict[f'{prefix}.arguments.service_name'] = \ conf_dict[f'{prefix}.arguments.service_name'] = \

View File

@@ -308,7 +308,7 @@ class CacheRegionTest(test_cache.BaseTestCase):
config_dict = cache._build_cache_config(self.config_fixture.conf) config_dict = cache._build_cache_config(self.config_fixture.conf)
self.assertEqual( self.assertEqual(
'redis://localhost:6379', 'redis://localhost:6379/0',
config_dict['test_prefix.arguments.url']) config_dict['test_prefix.arguments.url'])
self.assertFalse(self.config_fixture.conf.cache.tls_enabled) self.assertFalse(self.config_fixture.conf.cache.tls_enabled)
self.assertNotIn('test_prefix.arguments.connection_kwargs', self.assertNotIn('test_prefix.arguments.connection_kwargs',
@@ -373,7 +373,7 @@ class CacheRegionTest(test_cache.BaseTestCase):
self.assertIn('test_prefix.arguments.connection_kwargs', self.assertIn('test_prefix.arguments.connection_kwargs',
config_dict) config_dict)
self.assertEqual( self.assertEqual(
'rediss://localhost:6379', 'rediss://localhost:6379/0',
config_dict['test_prefix.arguments.url']) config_dict['test_prefix.arguments.url'])
self.assertEqual( self.assertEqual(
{ {
@@ -755,23 +755,51 @@ class CacheRegionTest(test_cache.BaseTestCase):
'.pool_flush_on_reconnect']) '.pool_flush_on_reconnect'])
def test_cache_dictionary_config_builder_redis(self): def test_cache_dictionary_config_builder_redis(self):
"""Validate the backend is reset to default if caching is disabled.""" """Validate we build a sane dogpile.cache dictionary config."""
self.config_fixture.config(group='cache', self.config_fixture.config(group='cache',
config_prefix='test_prefix', config_prefix='test_prefix',
backend='dogpile.cache.redis', backend='dogpile.cache.redis',
redis_server='[::1]:6379', redis_server='[::1]:6379')
redis_username='user',
redis_password='secrete')
config_dict = cache._build_cache_config(self.config_fixture.conf) config_dict = cache._build_cache_config(self.config_fixture.conf)
self.assertEqual( self.assertEqual(
'redis://user:secrete@[::1]:6379', 'redis://[::1]:6379/0',
config_dict['test_prefix.arguments.url']) config_dict['test_prefix.arguments.url'])
self.assertEqual( self.assertEqual(
1.0, config_dict['test_prefix.arguments.socket_timeout']) 1.0, config_dict['test_prefix.arguments.socket_timeout'])
def test_cache_dictionary_config_builder_redis_with_db(self):
"""Validate we build a sane dogpile.cache dictionary config."""
self.config_fixture.config(group='cache',
config_prefix='test_prefix',
backend='dogpile.cache.redis',
redis_server='[::1]:6379',
redis_db=1)
config_dict = cache._build_cache_config(self.config_fixture.conf)
self.assertEqual(
'redis://[::1]:6379/1',
config_dict['test_prefix.arguments.url'])
self.assertEqual(
1.0, config_dict['test_prefix.arguments.socket_timeout'])
def test_cache_dictionary_config_builder_redis_with_sock_to(self):
"""Validate we build a sane dogpile.cache dictionary config."""
self.config_fixture.config(group='cache',
config_prefix='test_prefix',
backend='dogpile.cache.redis',
redis_server='[::1]:6379',
redis_socket_timeout=10.0)
config_dict = cache._build_cache_config(self.config_fixture.conf)
self.assertEqual(
'redis://[::1]:6379/0',
config_dict['test_prefix.arguments.url'])
self.assertEqual(
10.0, config_dict['test_prefix.arguments.socket_timeout'])
def test_cache_dictionary_config_builder_redis_with_keepalive(self): def test_cache_dictionary_config_builder_redis_with_keepalive(self):
"""Validate the backend is reset to default if caching is disabled.""" """Validate we build a sane dogpile.cache dictionary config."""
self.config_fixture.config(group='cache', self.config_fixture.config(group='cache',
config_prefix='test_prefix', config_prefix='test_prefix',
backend='dogpile.cache.redis', backend='dogpile.cache.redis',
@@ -780,7 +808,7 @@ class CacheRegionTest(test_cache.BaseTestCase):
config_dict = cache._build_cache_config(self.config_fixture.conf) config_dict = cache._build_cache_config(self.config_fixture.conf)
self.assertEqual( self.assertEqual(
'redis://[::1]:6379', 'redis://[::1]:6379/0',
config_dict['test_prefix.arguments.url']) config_dict['test_prefix.arguments.url'])
self.assertEqual( self.assertEqual(
1.0, config_dict['test_prefix.arguments.socket_timeout']) 1.0, config_dict['test_prefix.arguments.socket_timeout'])
@@ -793,7 +821,7 @@ class CacheRegionTest(test_cache.BaseTestCase):
}}, config_dict['test_prefix.arguments.connection_kwargs']) }}, config_dict['test_prefix.arguments.connection_kwargs'])
def test_cache_dictionary_config_builder_redis_with_keepalive_params(self): def test_cache_dictionary_config_builder_redis_with_keepalive_params(self):
"""Validate the backend is reset to default if caching is disabled.""" """Validate we build a sane dogpile.cache dictionary config."""
self.config_fixture.config(group='cache', self.config_fixture.config(group='cache',
config_prefix='test_prefix', config_prefix='test_prefix',
backend='dogpile.cache.redis', backend='dogpile.cache.redis',
@@ -805,7 +833,7 @@ class CacheRegionTest(test_cache.BaseTestCase):
config_dict = cache._build_cache_config(self.config_fixture.conf) config_dict = cache._build_cache_config(self.config_fixture.conf)
self.assertEqual( self.assertEqual(
'redis://[::1]:6379', 'redis://[::1]:6379/0',
config_dict['test_prefix.arguments.url']) config_dict['test_prefix.arguments.url'])
self.assertEqual( self.assertEqual(
1.0, config_dict['test_prefix.arguments.socket_timeout']) 1.0, config_dict['test_prefix.arguments.socket_timeout'])
@@ -818,7 +846,20 @@ class CacheRegionTest(test_cache.BaseTestCase):
}}, config_dict['test_prefix.arguments.connection_kwargs']) }}, config_dict['test_prefix.arguments.connection_kwargs'])
def test_cache_dictionary_config_builder_redis_with_auth(self): def test_cache_dictionary_config_builder_redis_with_auth(self):
"""Validate the backend is reset to default if caching is disabled.""" """Validate we build a sane dogpile.cache dictionary config."""
self.config_fixture.config(group='cache',
config_prefix='test_prefix',
backend='dogpile.cache.redis',
redis_server='[::1]:6379',
redis_password='secrete')
config_dict = cache._build_cache_config(self.config_fixture.conf)
self.assertEqual(
'redis://:secrete@[::1]:6379/0',
config_dict['test_prefix.arguments.url'])
def test_cache_dictionary_config_builder_redis_with_auth_and_user(self):
"""Validate we build a sane dogpile.cache dictionary config."""
self.config_fixture.config(group='cache', self.config_fixture.config(group='cache',
config_prefix='test_prefix', config_prefix='test_prefix',
backend='dogpile.cache.redis', backend='dogpile.cache.redis',
@@ -828,11 +869,11 @@ class CacheRegionTest(test_cache.BaseTestCase):
config_dict = cache._build_cache_config(self.config_fixture.conf) config_dict = cache._build_cache_config(self.config_fixture.conf)
self.assertEqual( self.assertEqual(
'redis://user:secrete@[::1]:6379', 'redis://user:secrete@[::1]:6379/0',
config_dict['test_prefix.arguments.url']) config_dict['test_prefix.arguments.url'])
def test_cache_dictionary_config_builder_redis_sentinel(self): def test_cache_dictionary_config_builder_redis_sentinel(self):
"""Validate the backend is reset to default if caching is disabled.""" """Validate we build a sane dogpile.cache dictionary config."""
self.config_fixture.config(group='cache', self.config_fixture.config(group='cache',
enabled=True, enabled=True,
config_prefix='test_prefix', config_prefix='test_prefix',
@@ -841,6 +882,8 @@ class CacheRegionTest(test_cache.BaseTestCase):
config_dict = cache._build_cache_config(self.config_fixture.conf) config_dict = cache._build_cache_config(self.config_fixture.conf)
self.assertFalse(self.config_fixture.conf.cache.tls_enabled) self.assertFalse(self.config_fixture.conf.cache.tls_enabled)
self.assertEqual(
0, config_dict['test_prefix.arguments.db'])
self.assertEqual( self.assertEqual(
'mymaster', config_dict['test_prefix.arguments.service_name']) 'mymaster', config_dict['test_prefix.arguments.service_name'])
self.assertEqual([ self.assertEqual([
@@ -853,14 +896,65 @@ class CacheRegionTest(test_cache.BaseTestCase):
self.assertNotIn('test_prefix.arguments.sentinel_kwargs', self.assertNotIn('test_prefix.arguments.sentinel_kwargs',
config_dict) config_dict)
def test_cache_dictionary_config_builder_redis_sentinel_with_db(self):
"""Validate we build a sane dogpile.cache dictionary config."""
self.config_fixture.config(group='cache',
enabled=True,
config_prefix='test_prefix',
backend='dogpile.cache.redis_sentinel',
redis_db=1)
config_dict = cache._build_cache_config(self.config_fixture.conf)
self.assertFalse(self.config_fixture.conf.cache.tls_enabled)
self.assertEqual(
1, config_dict['test_prefix.arguments.db'])
self.assertEqual(
'mymaster', config_dict['test_prefix.arguments.service_name'])
self.assertEqual([
('localhost', 26379)
], config_dict['test_prefix.arguments.sentinels'])
self.assertEqual(
1.0, config_dict['test_prefix.arguments.socket_timeout'])
self.assertNotIn('test_prefix.arguments.connection_kwargs',
config_dict)
self.assertNotIn('test_prefix.arguments.sentinel_kwargs',
config_dict)
def test_cache_dictionary_config_builder_redis_sentinel_with_sock_to(self):
"""Validate we build a sane dogpile.cache dictionary config."""
self.config_fixture.config(group='cache',
enabled=True,
config_prefix='test_prefix',
backend='dogpile.cache.redis_sentinel',
redis_socket_timeout=10.0)
config_dict = cache._build_cache_config(self.config_fixture.conf)
self.assertFalse(self.config_fixture.conf.cache.tls_enabled)
self.assertEqual(
0, config_dict['test_prefix.arguments.db'])
self.assertEqual(
'mymaster', config_dict['test_prefix.arguments.service_name'])
self.assertEqual([
('localhost', 26379)
], config_dict['test_prefix.arguments.sentinels'])
self.assertEqual(
10.0, config_dict['test_prefix.arguments.socket_timeout'])
self.assertNotIn('test_prefix.arguments.connection_kwargs',
config_dict)
self.assertNotIn('test_prefix.arguments.sentinel_kwargs',
config_dict)
def test_cache_dictionary_config_builder_redis_sentinel_with_auth(self): def test_cache_dictionary_config_builder_redis_sentinel_with_auth(self):
"""Validate the backend is reset to default if caching is disabled.""" """Validate we build a sane dogpile.cache dictionary config."""
self.config_fixture.config(group='cache', self.config_fixture.config(group='cache',
enabled=True, enabled=True,
config_prefix='test_prefix', config_prefix='test_prefix',
backend='dogpile.cache.redis_sentinel', backend='dogpile.cache.redis_sentinel',
redis_username='user', redis_username='user',
redis_password='secrete', redis_password='secrete',
redis_db=1,
redis_sentinels=[ redis_sentinels=[
'127.0.0.1:26379', '127.0.0.1:26379',
'[::1]:26379', '[::1]:26379',
@@ -871,6 +965,8 @@ class CacheRegionTest(test_cache.BaseTestCase):
config_dict = cache._build_cache_config(self.config_fixture.conf) config_dict = cache._build_cache_config(self.config_fixture.conf)
self.assertFalse(self.config_fixture.conf.cache.tls_enabled) self.assertFalse(self.config_fixture.conf.cache.tls_enabled)
self.assertEqual(
1, config_dict['test_prefix.arguments.db'])
self.assertEqual( self.assertEqual(
'cluster', config_dict['test_prefix.arguments.service_name']) 'cluster', config_dict['test_prefix.arguments.service_name'])
self.assertEqual([ self.assertEqual([

View File

@@ -0,0 +1,5 @@
---
features:
- |
The new ``[cache] redis_db`` option has been added, so that a non-default
database can be used.