Skip to content

Commit 030293c

Browse files
authored
Use 'importlib' module in lieu of deprecated 'imp' module (#1450)
Migrate from using the `imp` module to using the `importlib` module. As of Python 3, the `imp` module has been deprecated in favor of the `importlib` module. Place logic in a new function, `load_module_from_source()` in a new file, `utilities_common/general.py` Also fix some formatting
1 parent 50e5c61 commit 030293c

18 files changed

+206
-164
lines changed

config/config_mgmt.py

+16-23
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,21 @@
22
config_mgmt.py provides classes for configuration validation and for Dynamic
33
Port Breakout.
44
'''
5-
try:
6-
import re
7-
import syslog
5+
import re
6+
import syslog
7+
from json import load
8+
from sys import flags
9+
from time import sleep as tsleep
810

9-
from json import load
10-
from time import sleep as tsleep
11-
from imp import load_source
12-
from jsondiff import diff
13-
from sys import flags
11+
import sonic_yang
12+
from jsondiff import diff
13+
from swsssdk import port_util
14+
from swsscommon.swsscommon import SonicV2Connector, ConfigDBConnector
15+
from utilities_common.general import load_module_from_source
1416

15-
# SONiC specific imports
16-
import sonic_yang
17-
from swsssdk import port_util
18-
from swsscommon.swsscommon import SonicV2Connector, ConfigDBConnector
1917

20-
# Using load_source to 'import /usr/local/bin/sonic-cfggen as sonic_cfggen'
21-
# since /usr/local/bin/sonic-cfggen does not have .py extension.
22-
load_source('sonic_cfggen', '/usr/local/bin/sonic-cfggen')
23-
from sonic_cfggen import deep_update, FormatConverter
24-
25-
except ImportError as e:
26-
raise ImportError("%s - required module not found" % str(e))
18+
# Load sonic-cfggen from source since /usr/local/bin/sonic-cfggen does not have .py extension.
19+
sonic_cfggen = load_module_from_source('sonic_cfggen', '/usr/local/bin/sonic-cfggen')
2720

2821
# Globals
2922
YANG_DIR = "/usr/local/yang-models"
@@ -193,8 +186,8 @@ def readConfigDB(self):
193186
data = dict()
194187
configdb = ConfigDBConnector()
195188
configdb.connect()
196-
deep_update(data, FormatConverter.db_to_output(configdb.get_config()))
197-
self.configdbJsonIn = FormatConverter.to_serialized(data)
189+
sonic_cfggen.deep_update(data, sonic_cfggen.FormatConverter.db_to_output(configdb.get_config()))
190+
self.configdbJsonIn = sonic_cfggen.FormatConverter.to_serialized(data)
198191
self.sysLog(syslog.LOG_DEBUG, 'Reading Input from ConfigDB {}'.\
199192
format(self.configdbJsonIn))
200193

@@ -214,9 +207,9 @@ def writeConfigDB(self, jDiff):
214207
data = dict()
215208
configdb = ConfigDBConnector()
216209
configdb.connect(False)
217-
deep_update(data, FormatConverter.to_deserialized(jDiff))
210+
sonic_cfggen.deep_update(data, sonic_cfggen.FormatConverter.to_deserialized(jDiff))
218211
self.sysLog(msg="Write in DB: {}".format(data))
219-
configdb.mod_config(FormatConverter.output_to_db(data))
212+
configdb.mod_config(sonic_cfggen.FormatConverter.output_to_db(data))
220213

221214
return
222215

pfcwd/main.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1+
import importlib
12
import os
2-
import imp
33
import sys
44

55
import click
6-
76
import utilities_common.cli as clicommon
8-
97
from natsort import natsorted
108
from sonic_py_common.multi_asic import get_external_ports
119
from tabulate import tabulate
@@ -27,7 +25,7 @@
2725
import mock_tables.dbconnector
2826
if os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] == "multi_asic":
2927
import mock_tables.mock_multi_asic
30-
imp.reload(mock_tables.mock_multi_asic)
28+
importlib.reload(mock_tables.mock_multi_asic)
3129
mock_tables.dbconnector.load_namespace_config()
3230

3331
except KeyError:

tests/aclshow_test.py

+62-37
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
1-
import sys
1+
import json
22
import os
3-
from imp import load_source
3+
import sys
44
from io import StringIO
55
from unittest import mock
66

7+
from utilities_common.general import load_module_from_source
78

89
test_path = os.path.dirname(os.path.abspath(__file__))
910
modules_path = os.path.dirname(test_path)
1011
scripts_path = os.path.join(modules_path, "scripts")
1112
sys.path.insert(0, modules_path)
1213

13-
load_source('aclshow', scripts_path+'/aclshow')
14-
from aclshow import *
14+
# Load the file under test
15+
aclshow_path = os.path.join(scripts_path, 'aclshow')
16+
aclshow = load_module_from_source('aclshow', aclshow_path)
1517

1618
from .mock_tables import dbconnector
1719

1820

1921
# Expected output for aclshow
20-
default_output = ''+ \
21-
"""RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
22+
default_output = """\
23+
RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
2224
------------ ------------ ------ --------------- -------------
2325
RULE_1 DATAACL 9999 101 100
2426
RULE_2 DATAACL 9998 201 200
@@ -32,8 +34,8 @@
3234
"""
3335

3436
# Expected output for aclshow -a
35-
all_output = '' + \
36-
"""RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
37+
all_output = """\
38+
RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
3739
------------ ------------ ------ --------------- -------------
3840
RULE_1 DATAACL 9999 101 100
3941
RULE_2 DATAACL 9998 201 200
@@ -49,35 +51,35 @@
4951
"""
5052

5153
# Expected output for aclshow -r RULE_1 -t DATAACL
52-
rule1_dataacl_output = '' + \
53-
"""RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
54+
rule1_dataacl_output = """\
55+
RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
5456
----------- ------------ ------ --------------- -------------
5557
RULE_1 DATAACL 9999 101 100
5658
"""
5759

5860
# Expected output for aclshow -r RULE_1 -t DATAACL
59-
rule10_dataacl_output = '' + \
60-
"""RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
61+
rule10_dataacl_output = """\
62+
RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
6163
----------- ------------ ------ --------------- -------------
6264
RULE_10 DATAACL 9989 1001 1000
6365
"""
6466

6567
# Expected output for aclshow -a -r RULE_05
66-
rule05_all_output = ''+ \
67-
"""RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
68+
rule05_all_output = """\
69+
RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
6870
----------- ------------ ------ --------------- -------------
6971
RULE_05 DATAACL 9995 0 0
7072
"""
7173

7274
# Expected output for aclshow -r RULE_0
73-
rule0_output = '' + \
74-
"""RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
75+
rule0_output = """\
76+
RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
7577
----------- ------------ ------ --------------- -------------
7678
"""
7779

7880
# Expected output for aclshow -r RULE_4,RULE_6 -vv
79-
rule4_rule6_verbose_output = '' + \
80-
"""Reading ACL info...
81+
rule4_rule6_verbose_output = """\
82+
Reading ACL info...
8183
Total number of ACL Tables: 8
8284
Total number of ACL Rules: 11
8385
@@ -88,15 +90,15 @@
8890
"""
8991

9092
# Expected output for aclshow -t EVERFLOW
91-
everflow_output = '' + \
92-
"""RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
93+
everflow_output = """\
94+
RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
9395
----------- ------------ ------ --------------- -------------
9496
RULE_6 EVERFLOW 9994 601 600
9597
"""
9698

9799
# Expected output for aclshow -t DATAACL
98-
dataacl_output = '' + \
99-
"""RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
100+
dataacl_output = """\
101+
RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
100102
------------ ------------ ------ --------------- -------------
101103
RULE_1 DATAACL 9999 101 100
102104
RULE_2 DATAACL 9998 201 200
@@ -113,8 +115,8 @@
113115

114116
# Expected output for
115117
# aclshow -a -c ; aclshow -a
116-
all_after_clear_output = '' + \
117-
"""RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
118+
all_after_clear_output = """\
119+
RULE NAME TABLE NAME PRIO PACKETS COUNT BYTES COUNT
118120
------------ ------------ ------ --------------- -------------
119121
RULE_1 DATAACL 9999 0 0
120122
RULE_2 DATAACL 9998 0 0
@@ -129,6 +131,7 @@
129131
RULE_08 EVERFLOW 9992 0 0
130132
"""
131133

134+
132135
class Aclshow():
133136
def __init__(self, *args, **kwargs):
134137
"""
@@ -146,19 +149,19 @@ def nullify_counters(self):
146149
This method is used to empty dumped counters
147150
if exist in /tmp/.counters_acl.p (by default).
148151
"""
149-
if os.path.isfile(COUNTER_POSITION):
150-
with open(COUNTER_POSITION, 'w') as fp:
152+
if os.path.isfile(aclshow.COUNTER_POSITION):
153+
with open(aclshow.COUNTER_POSITION, 'w') as fp:
151154
json.dump([], fp)
152155

153156
def runTest(self):
154157
"""
155158
This method invokes main() from aclshow utility (parametrized by argparse)
156159
parametrized by mock argparse.
157160
"""
158-
@mock.patch('argparse.ArgumentParser.parse_args', return_value = argparse.Namespace(**self.kwargs))
159-
def run(mock_args):
160-
main()
161-
run()
161+
with mock.patch.object(aclshow.argparse.ArgumentParser,
162+
'parse_args',
163+
return_value=aclshow.argparse.Namespace(**self.kwargs)):
164+
aclshow.main()
162165

163166
def setUp(self):
164167
if self.nullify_on_start:
@@ -173,56 +176,78 @@ def tearDown(self):
173176
sys.stdout = self.old_stdout
174177

175178
# aclshow
179+
180+
176181
def test_default():
177-
test = Aclshow(all = None, clear = None, rules = None, tables = None, verbose = None)
182+
test = Aclshow(all=None, clear=None, rules=None, tables=None, verbose=None)
178183
assert test.result.getvalue() == default_output
179184

180185
# aclshow -a
186+
187+
181188
def test_all():
182-
test = Aclshow(all = True, clear = None, rules = None, tables = None, verbose = None)
189+
test = Aclshow(all=True, clear=None, rules=None, tables=None, verbose=None)
183190
assert test.result.getvalue() == all_output
184191

185192
# aclshow -r RULE_1 -t DATAACL
193+
194+
186195
def test_rule1_dataacl():
187-
test = Aclshow(all = None, clear = None, rules = 'RULE_1', tables = 'DATAACL', verbose = None)
196+
test = Aclshow(all=None, clear=None, rules='RULE_1', tables='DATAACL', verbose=None)
188197
assert test.result.getvalue() == rule1_dataacl_output
189198

190199
# aclshow -a -r RULE_05
200+
201+
191202
def test_rule05_all():
192-
test = Aclshow(all = True, clear = None, rules = 'RULE_05', tables = None, verbose = None)
203+
test = Aclshow(all=True, clear=None, rules='RULE_05', tables=None, verbose=None)
193204
assert test.result.getvalue() == rule05_all_output
194205

195206
# aclshow -r RULE_0
207+
208+
196209
def test_rule0():
197-
test = Aclshow(all = None, clear = None, rules = 'RULE_0', tables = None, verbose = None)
210+
test = Aclshow(all=None, clear=None, rules='RULE_0', tables=None, verbose=None)
198211
assert test.result.getvalue() == rule0_output
199212

200213
# aclshow -r RULE_10 -t DATAACL
214+
215+
201216
def test_rule10_lowercase_priority():
202-
test = Aclshow(all = None, clear = None, rules = 'RULE_10', tables = 'DATAACL', verbose = None)
217+
test = Aclshow(all=None, clear=None, rules='RULE_10', tables='DATAACL', verbose=None)
203218
assert test.result.getvalue() == rule10_dataacl_output
204219

205220
# aclshow -r RULE_4,RULE_6 -vv
221+
222+
206223
def test_rule4_rule6_verbose():
207-
test = Aclshow(all = None, clear = None, rules = 'RULE_4,RULE_6', tables = None, verbose = True)
224+
test = Aclshow(all=None, clear=None, rules='RULE_4,RULE_6', tables=None, verbose=True)
208225
assert test.result.getvalue() == rule4_rule6_verbose_output
209226

210227
# aclshow -t EVERFLOW
228+
229+
211230
def test_everflow():
212231
test = Aclshow(all=None, clear=None, rules=None, tables='EVERFLOW', verbose=None)
213232
assert test.result.getvalue() == everflow_output
214233

215234
# aclshow -t DATAACL
235+
236+
216237
def test_dataacl():
217238
test = Aclshow(all=None, clear=None, rules=None, tables='DATAACL', verbose=None)
218239
assert test.result.getvalue() == dataacl_output
219240

220241
# aclshow -c
242+
243+
221244
def test_clear():
222245
test = Aclshow(all=None, clear=True, rules=None, tables=None, verbose=None)
223246
assert test.result.getvalue() == clear_output
224247

225248
# aclshow -a -c ; aclshow -a
249+
250+
226251
def test_all_after_clear():
227252
nullify_on_start, nullify_on_exit = True, False
228253
test = Aclshow(nullify_on_start, nullify_on_exit, all=True, clear=True, rules=None, tables=None, verbose=None)

tests/buffer_test.py

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import imp
21
import os
32
import sys
43
from click.testing import CliRunner

tests/config_dpb_test.py

+11-10
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
import json
22
import os
33
import re
4-
from imp import load_source
54
from unittest import mock
65

76
import pytest
87
from click.testing import CliRunner
98
from utilities_common.db import Db
9+
from utilities_common.general import load_module_from_source
1010

1111
import config.main as config
1212

13-
load_source('sonic_cfggen', '/usr/local/bin/sonic-cfggen')
14-
from sonic_cfggen import deep_update, FormatConverter
13+
# Load sonic-cfggen from source since /usr/local/bin/sonic-cfggen does not have .py extension.
14+
sonic_cfggen = load_module_from_source('sonic_cfggen', '/usr/local/bin/sonic-cfggen')
15+
16+
# Import config_mgmt.py
17+
config_mgmt_py_path = os.path.join(os.path.dirname(__file__), '..', 'config', 'config_mgmt.py')
18+
config_mgmt = load_module_from_source('config_mgmt', config_mgmt_py_path)
1519

16-
load_source('config_mgmt', \
17-
os.path.join(os.path.dirname(__file__), '..', 'config', 'config_mgmt.py'))
18-
import config_mgmt
1920

2021
# Sample platform.json for Test
2122
BRKOUT_CFG_FILE_JSON = {
@@ -137,14 +138,14 @@ def mock_func(breakout_cfg_file, sonic_db):
137138

138139
def write_config_db(cfgdb, config):
139140
data = dict()
140-
deep_update(data, FormatConverter.to_deserialized(config))
141-
cfgdb.mod_config(FormatConverter.output_to_db(data))
141+
sonic_cfggen.deep_update(data, sonic_cfggen.FormatConverter.to_deserialized(config))
142+
cfgdb.mod_config(sonic_cfggen.FormatConverter.output_to_db(data))
142143
return
143144

144145
def read_config_db(cfgdb):
145146
data = dict()
146-
deep_update(data, FormatConverter.db_to_output(cfgdb.get_config()))
147-
return FormatConverter.to_serialized(data)
147+
sonic_cfggen.deep_update(data, sonic_cfggen.FormatConverter.db_to_output(cfgdb.get_config()))
148+
return sonic_cfggen.FormatConverter.to_serialized(data)
148149

149150
def writeJson(d, file):
150151
with open(file, 'w') as f:

0 commit comments

Comments
 (0)