Skip to content

Commit 4e132c1

Browse files
authored
[debug dump] Refactoring Modules and Unit Tests (sonic-net#1943)
What I did Moved the "populate_mock" method to dump/helper.py i.e. common to all the tests Moved the "add_to_ret_template" to Executor class i.e. common across all the modules. How I did it How to verify it Unit Tests's:
1 parent b550c44 commit 4e132c1

21 files changed

+57
-233
lines changed

dump/helper.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import os, sys
1+
import os, sys, json
22

33
def create_template_dict(dbs):
44
""" Generate a Template which will be returned by Executor Classes """
@@ -33,3 +33,15 @@ def sort_lists(ret_template):
3333
if isinstance(ret_template[db][key], list):
3434
ret_template[db][key].sort()
3535
return ret_template
36+
37+
38+
def populate_mock(db, db_names, dedicated_dbs):
39+
for db_name in db_names:
40+
db.connect(db_name)
41+
# Delete any default data
42+
db.delete_all_by_pattern(db_name, "*")
43+
with open(dedicated_dbs[db_name]) as f:
44+
mock_json = json.load(f)
45+
for key in mock_json:
46+
for field, value in mock_json[key].items():
47+
db.set(db_name, key, field, value)

dump/plugins/copp.py

+6-16
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ def __init__(self, match_engine=None):
7171
self.trap_group = ""
7272
self.trap_id = ""
7373
self.ns = ""
74-
self.ret_temp = {}
7574

7675
def fetch_all_trap_ids(self, ret):
7776
traps = []
@@ -108,17 +107,11 @@ def execute(self, params):
108107
def handle_state_db(self):
109108
req = MatchRequest(db="STATE_DB", table="COPP_TRAP_TABLE", key_pattern=self.copp_trap_cfg_key)
110109
ret = self.match_engine.fetch(req)
111-
if not ret["error"] and len(ret["keys"]) > 0:
112-
self.ret_temp["STATE_DB"]["keys"].append(ret["keys"][0])
113-
else:
114-
self.ret_temp["STATE_DB"]["tables_not_found"].append("COPP_TRAP_TABLE")
110+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"])
115111

116112
req = MatchRequest(db="STATE_DB", table="COPP_GROUP_TABLE", key_pattern=self.trap_group)
117113
ret = self.match_engine.fetch(req)
118-
if not ret["error"] and len(ret["keys"]) > 0:
119-
self.ret_temp["STATE_DB"]["keys"].append(ret["keys"][0])
120-
else:
121-
self.ret_temp["STATE_DB"]["tables_not_found"].append("COPP_GROUP_TABLE")
114+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"])
122115

123116
def handle_appl_db(self):
124117
req = MatchRequest(db="APPL_DB", table=APP_COPP_TABLE_NAME, key_pattern="*", field="trap_ids",
@@ -207,17 +200,15 @@ def __get_asic_policer_obj(self, policer_sai_obj):
207200
return
208201
req = MatchRequest(db="ASIC_DB", table=ASIC_POLICER_OBJ, key_pattern=policer_sai_obj, ns=self.ns)
209202
ret = self.match_engine.fetch(req)
210-
if not ret["error"] and len(ret["keys"]) > 0:
211-
self.ret_temp["ASIC_DB"]["keys"].append(ret["keys"][0])
203+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"], False)
212204

213205
def __get_asic_queue_obj(self, queue_sai_obj):
214206
# Not adding tp tables_not_found because of the type of reason specified for policer obj
215207
if not queue_sai_obj:
216208
return
217209
req = MatchRequest(db="ASIC_DB", table=ASIC_QUEUE_OBJ, field="SAI_QUEUE_ATTR_INDEX", value=queue_sai_obj, ns=self.ns)
218210
ret = self.match_engine.fetch(req)
219-
if not ret["error"] and len(ret["keys"]) > 0:
220-
self.ret_temp["ASIC_DB"]["keys"].append(ret["keys"][0])
211+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"], False)
221212

222213
def __get_asic_hostif_entry_obj(self, sai_trap_key):
223214
# Not adding tp tables_not_found because of the type of reason specified for policer obj
@@ -231,9 +222,9 @@ def __get_asic_hostif_entry_obj(self, sai_trap_key):
231222
req = MatchRequest(db="ASIC_DB", table=ASIC_HOSTIF_TABLE_ENTRY, field="SAI_HOSTIF_TABLE_ENTRY_ATTR_TRAP_ID",
232223
value=sai_trap_vid, return_fields=["SAI_HOSTIF_TABLE_ENTRY_ATTR_HOST_IF"], ns=self.ns)
233224
ret = self.match_engine.fetch(req)
225+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"], False)
234226
if not ret["error"] and len(ret["keys"]) > 0:
235227
sai_hostif_table_entry_key = ret["keys"][0]
236-
self.ret_temp["ASIC_DB"]["keys"].append(sai_hostif_table_entry_key)
237228
sai_hostif_vid = ret["return_values"][sai_hostif_table_entry_key]["SAI_HOSTIF_TABLE_ENTRY_ATTR_HOST_IF"]
238229
return sai_hostif_vid
239230

@@ -243,8 +234,7 @@ def __get_asic_hostif_obj(self, sai_hostif_vid):
243234
return
244235
req = MatchRequest(db="ASIC_DB", table=ASIC_HOSTIF, key_pattern=sai_hostif_vid, ns=self.ns)
245236
ret = self.match_engine.fetch(req)
246-
if not ret["error"] and len(ret["keys"]) > 0:
247-
self.ret_temp["ASIC_DB"]["keys"].append(ret["keys"][0])
237+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"], False)
248238

249239
# When the user writes config to CONFIG_DB, that takes precedence over default config
250240
def handle_user_and_default_config(self):

dump/plugins/evpn.py

-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ class Evpn(Executor):
1111

1212
def __init__(self, match_engine=None):
1313
super().__init__(match_engine)
14-
self.ret_temp = {}
1514
self.ns = ''
1615
self.remote_ip = ''
1716
self.vlan = ''
@@ -41,14 +40,6 @@ def execute(self, params):
4140
self.init_state_evpn_info(evpn_name)
4241
return self.ret_temp
4342

44-
def add_to_ret_template(self, table, db, keys, err):
45-
if not err and keys:
46-
self.ret_temp[db]["keys"].extend(keys)
47-
return True
48-
else:
49-
self.ret_temp[db]["tables_not_found"].extend([table])
50-
return False
51-
5243
def init_evpn_appl_info(self, evpn_name):
5344
req = MatchRequest(db="APPL_DB", table="VXLAN_REMOTE_VNI_TABLE", key_pattern=evpn_name, ns=self.ns)
5445
ret = self.match_engine.fetch(req)

dump/plugins/executor.py

+12
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ def __init__(self, match_engine=None):
1616
self.match_engine = MatchEngine(None)
1717
else:
1818
self.match_engine = match_engine
19+
self.ret_temp = {}
1920

2021
@abstractmethod
2122
def execute(self, params):
@@ -24,3 +25,14 @@ def execute(self, params):
2425
@abstractmethod
2526
def get_all_args(self, ns):
2627
pass
28+
29+
def add_to_ret_template(self, table, db, keys, err, add_to_tables_not_found=True):
30+
if db not in self.ret_temp:
31+
return []
32+
33+
if not err and keys:
34+
self.ret_temp[db]["keys"].extend(keys)
35+
return keys
36+
elif add_to_tables_not_found:
37+
self.ret_temp[db]["tables_not_found"].extend([table])
38+
return []

dump/plugins/port.py

-8
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,6 @@ def execute(self, params):
2929
self.init_state_port_info(port_name)
3030
return self.ret_temp
3131

32-
def add_to_ret_template(self, table, db, keys, err):
33-
if not err and keys:
34-
self.ret_temp[db]["keys"].extend(keys)
35-
return True
36-
else:
37-
self.ret_temp[db]["tables_not_found"].extend([table])
38-
return False
39-
4032
def init_port_config_info(self, port_name):
4133
req = MatchRequest(db="CONFIG_DB", table="PORT", key_pattern=port_name, ns=self.ns)
4234
ret = self.match_engine.fetch(req)

dump/plugins/portchannel.py

-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ class Portchannel(Executor):
1111

1212
def __init__(self, match_engine=None):
1313
super().__init__(match_engine)
14-
self.ret_temp = {}
1514
self.ns = ''
1615
self.lag_members = set()
1716

@@ -38,14 +37,6 @@ def execute(self, params_dict):
3837
self.init_lag_asic_info(lag_type_objs_asic)
3938
return self.ret_temp
4039

41-
def add_to_ret_template(self, table, db, keys, err):
42-
if not err and keys:
43-
self.ret_temp[db]["keys"].extend(keys)
44-
return True
45-
else:
46-
self.ret_temp[db]["tables_not_found"].extend([table])
47-
return False
48-
4940
def init_lag_config_info(self):
5041
req = MatchRequest(db="CONFIG_DB", table="PORTCHANNEL", key_pattern=self.lag_name, ns=self.ns)
5142
ret = self.match_engine.fetch(req)

dump/plugins/portchannel_member.py

-9
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ class Portchannel_Member(Executor):
1010

1111
def __init__(self, match_engine=None):
1212
super().__init__(match_engine)
13-
self.ret_temp = {}
1413
self.ns = ''
1514
self.lag_member_key = ''
1615
self.lag = ''
@@ -39,14 +38,6 @@ def execute(self, params_dict):
3938
self.init_lag_member_type_obj_asic_info()
4039
return self.ret_temp
4140

42-
def add_to_ret_template(self, table, db, keys, err):
43-
if not err and keys:
44-
self.ret_temp[db]["keys"].extend(keys)
45-
return True
46-
else:
47-
self.ret_temp[db]["tables_not_found"].extend([table])
48-
return False
49-
5041
def init_lag_member_config_info(self):
5142
req = MatchRequest(db="CONFIG_DB", table="PORTCHANNEL_MEMBER", key_pattern=self.lag_member_key, ns=self.ns)
5243
ret = self.match_engine.fetch(req)

dump/plugins/route.py

-9
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ def __init__(self, match_engine=None):
5353
4) CLASS_BASED_NEXT_HOP_GROUP_TABLE
5454
5) NEXTHOP_GROUP_TABLE
5555
"""
56-
self.ret_temp = {}
5756
self.ns = ''
5857
self.dest_net = ''
5958
self.nh_id = ''
@@ -83,14 +82,6 @@ def execute(self, params):
8382
self.init_asic_nh()
8483
return self.ret_temp
8584

86-
def add_to_ret_template(self, table, db, keys, err, add_to_tables_not_found=True):
87-
if not err and keys:
88-
self.ret_temp[db]["keys"].extend(keys)
89-
return keys
90-
elif add_to_tables_not_found:
91-
self.ret_temp[db]["tables_not_found"].extend([table])
92-
return []
93-
9485
def init_route_config_info(self):
9586
req = MatchRequest(db="CONFIG_DB", table="STATIC_ROUTE", key_pattern=self.dest_net, ns=self.ns)
9687
ret = self.match_engine.fetch(req)

dump/plugins/vlan.py

+5-18
Original file line numberDiff line numberDiff line change
@@ -30,27 +30,18 @@ def execute(self, params_dict):
3030
def init_vlan_config_info(self, vlan_name):
3131
req = MatchRequest(db="CONFIG_DB", table="VLAN", key_pattern=vlan_name, ns=self.ns)
3232
ret = self.match_engine.fetch(req)
33-
if not ret["error"] and len(ret["keys"]) != 0:
34-
self.ret_temp[req.db]["keys"] = ret["keys"]
35-
else:
36-
self.ret_temp[req.db]["tables_not_found"] = [req.table]
33+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"])
3734

3835
def init_vlan_appl_info(self, vlan_name):
3936
req = MatchRequest(db="APPL_DB", table="VLAN_TABLE", key_pattern=vlan_name, ns=self.ns)
4037
ret = self.match_engine.fetch(req)
41-
if not ret["error"] and len(ret["keys"]) != 0:
42-
self.ret_temp[req.db]["keys"] = ret["keys"]
43-
else:
44-
self.ret_temp[req.db]["tables_not_found"] = [req.table]
38+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"])
4539

4640
def init_state_vlan_info(self, vlan_name):
4741
req = MatchRequest(db="STATE_DB", table="VLAN_TABLE", key_pattern=vlan_name, ns=self.ns)
4842
ret = self.match_engine.fetch(req)
49-
if not ret["error"] and len(ret["keys"]) != 0:
50-
self.ret_temp[req.db]["keys"] = ret["keys"]
51-
else:
52-
self.ret_temp[req.db]["tables_not_found"] = [req.table]
53-
43+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"])
44+
5445
def init_asic_vlan_info(self, vlan_name):
5546
# Convert 'Vlanxxx' to 'xxx'
5647
if vlan_name[0:4] != "Vlan" or not vlan_name[4:].isnumeric():
@@ -62,8 +53,4 @@ def init_asic_vlan_info(self, vlan_name):
6253
req = MatchRequest(db="ASIC_DB", table="ASIC_STATE:SAI_OBJECT_TYPE_VLAN", key_pattern="*", field="SAI_VLAN_ATTR_VLAN_ID",
6354
value=str(vlan_num), ns=self.ns)
6455
ret = self.match_engine.fetch(req)
65-
if not ret["error"] and len(ret["keys"]) != 0:
66-
self.ret_temp[req.db]["keys"] = ret["keys"]
67-
else:
68-
self.ret_temp[req.db]["tables_not_found"] = [req.table]
69-
56+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"])

dump/plugins/vlan_member.py

+2-12
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,12 @@ def init_vlan_member_config_info(self, vlan_name, member_name):
4949
def init_vlan_member_appl_info(self, vlan_name, member_name):
5050
req = MatchRequest(db="APPL_DB", table="VLAN_MEMBER_TABLE", key_pattern=vlan_name+':'+member_name+"*", ns=self.ns)
5151
ret = self.match_engine.fetch(req)
52-
if not ret["error"] and len(ret["keys"]) != 0:
53-
for mem in ret["keys"]:
54-
self.ret_temp[req.db]["keys"].append(mem)
55-
else:
56-
self.ret_temp[req.db]["tables_not_found"].append(req.table)
52+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"])
5753

5854
def init_state_vlan_member_info(self, vlan_name, member_name):
5955
req = MatchRequest(db="STATE_DB", table="VLAN_MEMBER_TABLE", key_pattern=vlan_name+'|'+member_name+"*", ns=self.ns)
6056
ret = self.match_engine.fetch(req)
61-
if not ret["error"] and len(ret["keys"]) != 0:
62-
for mem in ret["keys"]:
63-
self.ret_temp[req.db]["keys"].append(mem)
64-
else:
65-
self.ret_temp[req.db]["tables_not_found"].append(req.table)
57+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"])
6658

6759
def init_asic_vlan_member_info(self, vlan_name, member_name):
6860

@@ -140,5 +132,3 @@ def init_asic_vlan_member_info(self, vlan_name, member_name):
140132
else:
141133
self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_VLAN_MEMBER")
142134
self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT")
143-
144-

dump/plugins/vxlan_tunnel.py

-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ class Vxlan_tunnel(Executor):
1111

1212
def __init__(self, match_engine=None):
1313
super().__init__(match_engine)
14-
self.ret_temp = {}
1514
self.ns = ''
1615
self.src_ip = ''
1716
self.dst_ip = ''
@@ -37,14 +36,6 @@ def execute(self, params):
3736
self.init_state_vxlan_tunnel_info(vxlan_tunnel_name)
3837
return self.ret_temp
3938

40-
def add_to_ret_template(self, table, db, keys, err):
41-
if not err and keys:
42-
self.ret_temp[db]["keys"].extend(keys)
43-
return True
44-
else:
45-
self.ret_temp[db]["tables_not_found"].extend([table])
46-
return False
47-
4839
def init_vxlan_tunnel_config_info(self, vxlan_tunnel_name):
4940
req = MatchRequest(db="CONFIG_DB", table="VXLAN_TUNNEL", key_pattern=vxlan_tunnel_name, ns=self.ns)
5041
ret = self.match_engine.fetch(req)

dump/plugins/vxlan_tunnel_map.py

-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ class Vxlan_tunnel_map(Executor):
1111

1212
def __init__(self, match_engine=None):
1313
super().__init__(match_engine)
14-
self.ret_temp = {}
1514
self.ns = ''
1615
self.vlan = ''
1716
self.vni = ''
@@ -35,14 +34,6 @@ def execute(self, params):
3534
self.init_asic_vxlan_tunnel_map_info()
3635
return self.ret_temp
3736

38-
def add_to_ret_template(self, table, db, keys, err):
39-
if not err and keys:
40-
self.ret_temp[db]["keys"].extend(keys)
41-
return True
42-
else:
43-
self.ret_temp[db]["tables_not_found"].extend([table])
44-
return False
45-
4637
def init_vxlan_tunnel_map_config_info(self, vxlan_tunnel_map_name):
4738
req = MatchRequest(db="CONFIG_DB", table="VXLAN_TUNNEL_MAP", key_pattern=vxlan_tunnel_map_name, ns=self.ns,
4839
return_fields=["vlan", "vni"])

tests/dump_tests/module_tests/copp_test.py

+2-14
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import pytest
77
from deepdiff import DeepDiff
88
from mock import patch
9-
from dump.helper import create_template_dict, sort_lists
9+
from dump.helper import create_template_dict, sort_lists, populate_mock
1010
from dump.plugins.copp import Copp
1111
from dump.match_infra import MatchEngine, ConnectionPool
1212
from swsscommon.swsscommon import SonicV2Connector
@@ -26,18 +26,6 @@
2626
dedicated_dbs['STATE_DB'] = os.path.join(copp_files_path, "state_db.json")
2727

2828

29-
def populate_mock(db, db_names):
30-
for db_name in db_names:
31-
db.connect(db_name)
32-
# Delete any default data
33-
db.delete_all_by_pattern(db_name, "*")
34-
with open(dedicated_dbs[db_name]) as f:
35-
mock_json = json.load(f)
36-
for key in mock_json:
37-
for field, value in mock_json[key].items():
38-
db.set(db_name, key, field, value)
39-
40-
4129
@pytest.fixture(scope="class", autouse=True)
4230
def match_engine():
4331

@@ -51,7 +39,7 @@ def match_engine():
5139
# popualate the db with mock data
5240
db_names = list(dedicated_dbs.keys())
5341
try:
54-
populate_mock(db, db_names)
42+
populate_mock(db, db_names, dedicated_dbs)
5543
except Exception as e:
5644
assert False, "Mock initialization failed: " + str(e)
5745

0 commit comments

Comments
 (0)