Skip to content

Commit b2b16ab

Browse files
seifertericericseifert
authored andcommitted
Allow deleting tables before updating
Add table_delete to mod_config in the ConfigDBPipeConnector to allow table cleanup as part of transaction Add unittest for ConfigDBConnector
1 parent 92991f0 commit b2b16ab

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
'redis>=4.5.4;python_version >= "3.0"',
55
'redis>=3.5.3;python_version < "3.0"',
66
'redis-dump-load',
7+
'fakeredis',
78
]
89

910
high_performance_deps = [

src/swsssdk/configdb.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,19 +392,27 @@ def __mod_entry(self, pipe, table, key, data):
392392
else:
393393
pipe.hmset(_hash, self.typed_to_raw(data))
394394

395-
def mod_config(self, data):
395+
def mod_config(self, data, table_delete=None):
396396
"""Write multiple tables into config db.
397397
Extra entries/fields in the db which are not in the data are kept.
398+
Pass one or more tables in table_delete to delete tables before update.
398399
Args:
399400
data: config data in a dictionary form
400401
{
401402
'TABLE_NAME': { 'row_key': {'column_key': 'value', ...}, ...},
402403
'MULTI_KEY_TABLE_NAME': { ('l1_key', 'l2_key', ...) : {'column_key': 'value', ...}, ...},
403404
...
404405
}
406+
table_delete: Table name(s) that will be deleted first before modify
405407
"""
406408
client = self.get_redis_client(self.db_name)
407409
pipe = client.pipeline()
410+
if table_delete:
411+
if isinstance(table_delete, list):
412+
for t in table_delete:
413+
self.__delete_table(client, pipe, t)
414+
else:
415+
self.__delete_table(client, pipe, table_delete)
408416
for table_name in data:
409417
table_data = data[table_name]
410418
if table_data is None:

test/test_configdb.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import os
2+
import sys
3+
4+
from unittest import mock
5+
6+
from unittest import TestCase
7+
8+
modules_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
9+
sys.path.insert(0, os.path.join(modules_path, 'src'))
10+
11+
import swsssdk
12+
import fakeredis
13+
14+
15+
class TestConfigDB(TestCase):
16+
def test__configdb_pipe(self):
17+
18+
s_db = swsssdk.ConfigDBPipeConnector()
19+
#Use fakeredis to mock redis db
20+
r_db = fakeredis.FakeStrictRedis(version=5)
21+
s_db.get_redis_client = lambda db_name: r_db
22+
s_db.db_name = "CONFIG_DB"
23+
24+
s_db.mod_config({'TABLE_NAME': { 'row_key': {'column_key1': 'valueA1', 'column_key2': 'valueB1'}}})
25+
self.assertEqual(r_db.hget('TABLE_NAME|row_key', 'column_key1'), b'valueA1')
26+
self.assertEqual(r_db.hget('TABLE_NAME|row_key', 'column_key2'), b'valueB1')
27+
s_db.mod_config({'TABLE_NAME': { 'row_key': {'column_key1': 'valueA2'}}}, table_delete='TABLE_NAME')
28+
self.assertEqual(r_db.hget('TABLE_NAME|row_key', 'column_key1'), b'valueA2')
29+
self.assertEqual(r_db.hget('TABLE_NAME|row_key', 'column_key2'), None)
30+
31+

0 commit comments

Comments
 (0)